diff options
Diffstat (limited to 'toys')
-rw-r--r-- | toys/pending/ifconfig.c | 122 |
1 files changed, 44 insertions, 78 deletions
diff --git a/toys/pending/ifconfig.c b/toys/pending/ifconfig.c index dfd26479..8269fc07 100644 --- a/toys/pending/ifconfig.c +++ b/toys/pending/ifconfig.c @@ -208,19 +208,7 @@ static void set_flags(int sockfd, struct ifreq *ifre, int set_flag, xioctl(sockfd, SIOCSIFFLAGS, ifre); } -static void set_metric(int sockfd, struct ifreq *ifre, char *metric) -{ - ifre->ifr_metric = strtoul(metric, NULL, 0); - xioctl(sockfd, SIOCSIFMETRIC, ifre); -} - -static void set_qlen(int sockfd, struct ifreq *ifre, char *qlen) -{ - ifre->ifr_qlen = strtoul(qlen, NULL, 0); - xioctl(sockfd, SIOCSIFTXQLEN, ifre); -} - -static void set_ipv6_addr(int sockfd, struct ifreq *ifre, char *ipv6_addr, int request, char *req_name) +static void set_ipv6_addr(int sockfd, struct ifreq *ifre, char *ipv6_addr, int request) { char *prefix; int plen = 0; @@ -305,7 +293,7 @@ static int hex_to_binary(char *hw_addr, struct sockaddr *sock, int count) return 0; } -static void set_hw_address(int sockfd, char ***argv, struct ifreq *ifre, int request, char *req_name) +static void set_hw_address(int sockfd, char ***argv, struct ifreq *ifre, int request) { int hw_class = 0; char *hw_addr; @@ -336,37 +324,6 @@ static void set_hw_address(int sockfd, char ***argv, struct ifreq *ifre, int req xioctl(sockfd, request, ifre); } -static void set_memstart(int sockfd, struct ifreq *ifre, char *start_addr, int request, char *req_name) -{ - unsigned long mem_start = strtoul(start_addr, NULL, 0); - - xioctl(sockfd, SIOCGIFMAP, ifre); - ifre->ifr_map.mem_start = mem_start; - xioctl(sockfd, request, ifre); -} - -static void set_ioaddr(int sockfd, struct ifreq *ifre, char *baddr, int request, char *req_name) -{ - unsigned short int base_addr = strtoul(baddr, NULL, 0); - xioctl(sockfd, SIOCGIFMAP, ifre); - ifre->ifr_map.base_addr = base_addr; - xioctl(sockfd, request, ifre); -} - -static void set_irq(int sockfd, struct ifreq *ifre, char *irq_val, int request, char *req_name) -{ - unsigned short int irq = strtoul(irq_val, NULL, 0); - char *ptr; - struct ifmap *map; - - xioctl(sockfd, SIOCGIFMAP, ifre); - - ptr = ((char *) ifre) + offsetof(struct ifreq, ifr_map); - map = (struct ifmap *)ptr; - map->irq = irq; - xioctl(sockfd, request, ifre); -} - static void add_iface_to_list(struct if_list *newnode) { struct if_list *head_ref = TT.if_list; @@ -694,20 +651,20 @@ void ifconfig_main(void) while(*++argv) { struct argh { char *name; - int flags[2], addr; // set, clear + int on, off; // set, clear } try[] = { - {"up", {IFF_UP|IFF_RUNNING, 0}, 0}, - {"down", {0, IFF_UP}, 0}, - {"arp", {0, IFF_NOARP}, 0}, - {"trailers", {0, IFF_NOTRAILERS}, 0}, - {"promisc", {IFF_PROMISC, 0}, 0}, - {"allmulti", {IFF_ALLMULTI, 0}, 0}, - {"multicast", {IFF_MULTICAST, 0}, 0}, - {"dynamic", {IFF_DYNAMIC, 0}, 0}, - {"pointopoint", {IFF_POINTOPOINT, 0}, SIOCSIFDSTADDR}, // 8918 - {"broadcast", {IFF_BROADCAST, 0}, SIOCSIFBRDADDR}, //891a - {"netmask", {0, 0}, SIOCSIFNETMASK}, - {"dstaddr", {0, 0}, SIOCSIFDSTADDR} + {"up", IFF_UP|IFF_RUNNING, 0}, + {"down", 0, IFF_UP}, + {"arp", 0, IFF_NOARP}, + {"trailers", 0, IFF_NOTRAILERS}, + {"promisc", IFF_PROMISC, 0}, + {"allmulti", IFF_ALLMULTI, 0}, + {"multicast", IFF_MULTICAST, 0}, + {"dynamic", IFF_DYNAMIC, 0}, + {"pointopoint", IFF_POINTOPOINT, SIOCSIFDSTADDR}, + {"broadcast", IFF_BROADCAST, SIOCSIFBRDADDR}, + {"netmask", 0, SIOCSIFNETMASK}, + {"dstaddr", 0, SIOCSIFDSTADDR} }; char *s = *argv; int rev = (*s == '-'); @@ -716,17 +673,22 @@ void ifconfig_main(void) for (i = 0; i < sizeof(try)/sizeof(*try); i++) { struct argh *t = try+i; + int on = t->on, off = t->off; if (strcmp(t->name, s)) continue; - if (!rev && t->addr) { - if (!*++argv) show_help(); - set_address(sockfd, *argv, &ifre, t->addr); + // Is this an SIOCSI entry? + if ((t->off | 0xff) == 0x89ff) { + if (!rev) { + if (!*++argv) show_help(); + set_address(sockfd, *argv, &ifre, off); + } + off = 0; } - if (t->flags[0] || t->flags[1]) { + if (on || off) { xioctl(sockfd, SIOCGIFFLAGS, &ifre); - ifre.ifr_flags &= ~t->flags[rev^1]; - ifre.ifr_flags |= t->flags[rev]; + ifre.ifr_flags &= ~(rev ? on : off); + ifre.ifr_flags |= (rev ? off : on); xioctl(sockfd, SIOCSIFFLAGS, &ifre); } @@ -736,7 +698,7 @@ void ifconfig_main(void) if (!strcmp(*argv, "hw")) { if (!*++argv) show_help(); - set_hw_address(sockfd, &argv, &ifre, SIOCSIFHWADDR, "SIOCSIFHWADDR"); + set_hw_address(sockfd, &argv, &ifre, SIOCSIFHWADDR); } else if (!strcmp(*argv, "mtu")) { if (!*++argv) show_help(); @@ -750,32 +712,36 @@ void ifconfig_main(void) if (!*++argv) show_help(); ifre.ifr_data = (void *)strtoul(*argv, 0, 0); xioctl(sockfd, SIOCSOUTFILL, &ifre); - - - } else if (!strcmp(*argv, "metric")) { if (!*++argv) show_help(); - set_metric(sockfd, &ifre, *argv); + ifre.ifr_metric = strtoul(*argv, NULL, 0); + xioctl(sockfd, SIOCSIFMETRIC, &ifre); } else if (!strcmp(*argv, "txqueuelen")) { if (!*++argv) show_help(); - set_qlen(sockfd, &ifre, *argv); + ifre.ifr_qlen = strtoul(*argv, NULL, 0); + xioctl(sockfd, SIOCSIFTXQLEN, &ifre); + } else if (!strcmp(*argv, "add")) { if (!*++argv) show_help(); - set_ipv6_addr(sockfd, &ifre, *argv, SIOCSIFADDR, "SIOCSIFADDR"); + set_ipv6_addr(sockfd, &ifre, *argv, SIOCSIFADDR); } else if (!strcmp(*argv, "del")) { if (!*++argv) show_help(); - set_ipv6_addr(sockfd, &ifre, *argv, SIOCDIFADDR, "SIOCDIFADDR"); + set_ipv6_addr(sockfd, &ifre, *argv, SIOCDIFADDR); } else if (!strcmp(*argv, "mem_start")) { if (!*++argv) show_help(); - set_memstart(sockfd, &ifre, *argv, SIOCSIFMAP, "SIOCSIFMAP"); + xioctl(sockfd, SIOCGIFMAP, &ifre); + ifre.ifr_map.mem_start = strtoul(*argv, NULL, 0); + xioctl(sockfd, SIOCSIFMAP, &ifre); } else if (!strcmp(*argv, "io_addr")) { if (!*++argv) show_help(); - set_ioaddr(sockfd, &ifre, *argv, SIOCSIFMAP, "SIOCSIFMAP"); + xioctl(sockfd, SIOCGIFMAP, &ifre); + ifre.ifr_map.base_addr = strtoul(*argv, NULL, 0); + xioctl(sockfd, SIOCSIFMAP, &ifre); } else if (!strcmp(*argv, "irq")) { if (!*++argv) show_help(); - set_irq(sockfd, &ifre, *argv, SIOCSIFMAP, "SIOCSIFMAP"); - - + xioctl(sockfd, SIOCGIFMAP, &ifre); + ifre.ifr_map.irq = strtoul(*argv, NULL, 0); + xioctl(sockfd, SIOCSIFMAP, &ifre); } else { if (isdigit(**argv) || !strcmp(*argv, "default")) { set_address(sockfd, *argv, &ifre, SIOCSIFADDR); @@ -786,7 +752,7 @@ void ifconfig_main(void) else { errno = EINVAL; toys.exithelp++; - error_exit("bad argument"); + error_exit("bad argument '%s'", *argv); } } |