changeset 906:ce0a9368b82f

Next round of ifconfig cleanup, to be described on mailing list.
author Rob Landley <rob@landley.net>
date Mon, 20 May 2013 20:50:25 -0500
parents e875b03e1fcc
children ecb0befac82a
files toys/pending/ifconfig.c
diffstat 1 files changed, 44 insertions(+), 78 deletions(-) [+]
line wrap: on
line diff
--- a/toys/pending/ifconfig.c	Sun May 19 00:48:19 2013 -0500
+++ b/toys/pending/ifconfig.c	Mon May 20 20:50:25 2013 -0500
@@ -208,19 +208,7 @@
   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 @@
   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 @@
   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 @@
   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 @@
 
     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 @@
 
       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 @@
         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 @@
         else {
           errno = EINVAL;
           toys.exithelp++;
-          error_exit("bad argument");
+          error_exit("bad argument '%s'", *argv);
         }
       }