X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;ds=sidebyside;f=networking%2Fnameif.c;h=52aad287375b626f27415bf64b2b27250f412b9d;hb=d1a302b52f11563240db5313344a1331613e1538;hp=dca7c8c08f95e31be9c2b538151502ccb37fb170;hpb=40ea66cd9d06677cb24e2293e065c101c0dfa64b;p=oweals%2Fbusybox.git diff --git a/networking/nameif.c b/networking/nameif.c index dca7c8c08..52aad2873 100644 --- a/networking/nameif.c +++ b/networking/nameif.c @@ -1,39 +1,19 @@ +/* vi: set sw=4 ts=4: */ /* * nameif.c - Naming Interfaces based on MAC address for busybox. * - * Writen 2000 by Andi Kleen. + * Written 2000 by Andi Kleen. * Busybox port 2002 by Nick Fedchik - * Glenn McGrath - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - * 02111-1307 USA + * Glenn McGrath * + * Licensed under the GPL v2 or later, see the file LICENSE in this tarball. */ - -#include -#include -#include -#include -#include -#include -#include +#include "busybox.h" +#include #include #include -#include "busybox.h" /* Older versions of net/if.h do not appear to define IF_NAMESIZE. */ #ifndef IF_NAMESIZE @@ -47,7 +27,7 @@ /* take from linux/sockios.h */ #define SIOCSIFNAME 0x8923 /* set interface name */ -/* Octets in one ethernet addr, from */ +/* Octets in one Ethernet addr, from */ #define ETH_ALEN 6 #ifndef ifr_newname @@ -61,38 +41,14 @@ typedef struct mactable_s { struct ether_addr *mac; } mactable_t; -static unsigned char use_syslog; - -static void serror(const char *s, ...) __attribute__ ((noreturn)); - -static void serror(const char *s, ...) -{ - va_list ap; - - va_start(ap, s); - - if (use_syslog) { - openlog(bb_applet_name, 0, LOG_LOCAL0); - vsyslog(LOG_ERR, s, ap); - closelog(); - } else { - bb_verror_msg(s, ap); - putc('\n', stderr); - } - - va_end(ap); - - exit(EXIT_FAILURE); -} - /* Check ascii str_macaddr, convert and copy to *mac */ -struct ether_addr *cc_macaddr(char *str_macaddr) +static struct ether_addr *cc_macaddr(const char *str_macaddr) { struct ether_addr *lmac, *mac; lmac = ether_aton(str_macaddr); if (lmac == NULL) - serror("cannot parse MAC %s", str_macaddr); + bb_error_msg_and_die("cannot parse MAC %s", str_macaddr); mac = xmalloc(ETH_ALEN); memcpy(mac, lmac, ETH_ALEN); @@ -106,22 +62,12 @@ int nameif_main(int argc, char **argv) const char *fname = "/etc/mactab"; char *line; int ctl_sk; - int opt; int if_index = 1; mactable_t *ch; - - while ((opt = getopt(argc, argv, "c:s")) != -1) { - switch (opt) { - case 'c': - fname = optarg; - break; - case 's': - use_syslog = 1; - break; - default: - bb_show_usage(); - } + if (1 & getopt32(argc, argv, "sc:", &fname)) { + openlog(applet_name, 0, LOG_LOCAL0); + logmode = LOGMODE_SYSLOG; } if ((argc - optind) & 1) @@ -131,11 +77,11 @@ int nameif_main(int argc, char **argv) char **a = argv + optind; while (*a) { - if (strlen(*a) > IF_NAMESIZE) - serror("interface name `%s' too long", *a); - ch = xcalloc(1, sizeof(mactable_t)); - ch->ifname = bb_xstrdup(*a++); + bb_error_msg_and_die("interface name '%s' " + "too long", *a); + ch = xzalloc(sizeof(mactable_t)); + ch->ifname = xstrdup(*a++); ch->mac = cc_macaddr(*a++); if (clist) clist->prev = ch; @@ -143,20 +89,23 @@ int nameif_main(int argc, char **argv) clist = ch; } } else { - ifh = bb_xfopen(fname, "r"); + ifh = xfopen(fname, "r"); - while ((line = bb_get_line_from_file(ifh)) != NULL) { + while ((line = xmalloc_fgets(ifh)) != NULL) { char *line_ptr; size_t name_length; line_ptr = line + strspn(line, " \t"); - if ((line_ptr[0] == '#') || (line_ptr[0] == '\n')) + if ((line_ptr[0] == '#') || (line_ptr[0] == '\n')) { + free(line); continue; + } name_length = strcspn(line_ptr, " \t"); - ch = xcalloc(1, sizeof(mactable_t)); - ch->ifname = bb_xstrndup(line_ptr, name_length); + ch = xzalloc(sizeof(mactable_t)); + ch->ifname = xstrndup(line_ptr, name_length); if (name_length > IF_NAMESIZE) - serror("interface name `%s' too long", ch->ifname); + bb_error_msg_and_die("interface name '%s' " + "too long", ch->ifname); line_ptr += name_length; line_ptr += strspn(line_ptr, " \t"); name_length = strspn(line_ptr, "0123456789ABCDEFabcdef:"); @@ -171,13 +120,12 @@ int nameif_main(int argc, char **argv) fclose(ifh); } - if ((ctl_sk = socket(PF_INET, SOCK_DGRAM, 0)) == -1) - serror("socket: %m"); + ctl_sk = xsocket(PF_INET, SOCK_DGRAM, 0); while (clist) { struct ifreq ifr; - bzero(&ifr, sizeof(struct ifreq)); + memset(&ifr, 0, sizeof(struct ifreq)); if_index++; ifr.ifr_ifindex = if_index; @@ -200,7 +148,7 @@ int nameif_main(int argc, char **argv) strcpy(ifr.ifr_newname, ch->ifname); if (ioctl(ctl_sk, SIOCSIFNAME, &ifr) < 0) - serror("cannot change ifname %s to %s: %m", + bb_perror_msg_and_die("cannot change ifname %s to %s", ifr.ifr_name, ch->ifname); /* Remove list entry of renamed interface */ @@ -211,11 +159,11 @@ int nameif_main(int argc, char **argv) } if (ch->next != NULL) (ch->next)->prev = ch->prev; -#ifdef CONFIG_FEATURE_CLEAN_UP - free(ch->ifname); - free(ch->mac); - free(ch); -#endif + if (ENABLE_FEATURE_CLEAN_UP) { + free(ch->ifname); + free(ch->mac); + free(ch); + } } return 0;