swconfig: add show command
authorFelix Fietkau <nbd@openwrt.org>
Mon, 15 Feb 2010 17:29:00 +0000 (17:29 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Mon, 15 Feb 2010 17:29:00 +0000 (17:29 +0000)
Add a "show" command, which displays all attributes of the selected port,
VLAN, or of the whole switch.

Signed-off-by: Martin Mares <mj@ucw.cz>
SVN-Revision: 19640

package/swconfig/src/cli.c

index 64d67b2e27f5592f9d08eec9e32de71a7b9371e8..d8d8e512b2c011e0e33b69f7a4fbc360e01c6365 100644 (file)
@@ -39,6 +39,7 @@ enum {
        CMD_SET,
        CMD_LOAD,
        CMD_HELP,
+       CMD_SHOW,
 };
 
 static void
@@ -81,10 +82,80 @@ list_attributes(struct switch_dev *dev)
        print_attrs(dev->port_ops);
 }
 
+static void
+print_attr_val(const struct switch_attr *attr, const struct switch_val *val)
+{
+       int i;
+
+       switch (attr->type) {
+       case SWITCH_TYPE_INT:
+               printf("%d", val->value.i);
+               break;
+       case SWITCH_TYPE_STRING:
+               printf("%s", val->value.s);
+               break;
+       case SWITCH_TYPE_PORTS:
+               for(i = 0; i < val->len; i++) {
+                       printf("%d%s ",
+                               val->value.ports[i].id,
+                               (val->value.ports[i].flags &
+                                SWLIB_PORT_FLAG_TAGGED) ? "t" : "");
+               }
+               break;
+       default:
+               printf("?unknown-type?");
+       }
+}
+
+static void
+show_attrs(struct switch_dev *dev, struct switch_attr *attr, struct switch_val *val)
+{
+       while (attr) {
+               if (attr->type != SWITCH_TYPE_NOVAL) {
+                       printf("\t%s: ", attr->name);
+                       if (swlib_get_attr(dev, attr, val) < 0)
+                               printf("???");
+                       else
+                               print_attr_val(attr, val);
+                       putchar('\n');
+               }
+               attr = attr->next;
+       }
+}
+
+static void
+show_global(struct switch_dev *dev)
+{
+       struct switch_val val;
+
+       printf("Global attributes:\n");
+       show_attrs(dev, dev->ops, &val);
+}
+
+static void
+show_port(struct switch_dev *dev, int port)
+{
+       struct switch_val val;
+
+       printf("Port %d:\n", port);
+       val.port_vlan = port;
+       show_attrs(dev, dev->port_ops, &val);
+}
+
+static void
+show_vlan(struct switch_dev *dev, int vlan)
+{
+       struct switch_val val;
+
+       printf("VLAN %d:\n", vlan);
+       val.port_vlan = vlan;
+       show_attrs(dev, dev->vlan_ops, &val);
+}
+
 static void
 print_usage(void)
 {
-       printf("swconfig dev <dev> [port <port>|vlan <vlan>] (help|set <key> <value>|get <key>|load <config>)\n");
+       printf("swconfig dev <dev> [port <port>|vlan <vlan>] (help|set <key> <value>|get <key>|load <config>|show)\n");
        exit(1);
 }
 
@@ -165,6 +236,8 @@ int main(int argc, char **argv)
                                print_usage();
                        cmd = CMD_LOAD;
                        ckey = argv[++i];
+               } else if (!strcmp(arg, "show")) {
+                       cmd = CMD_SHOW;
                } else {
                        print_usage();
                }
@@ -252,6 +325,20 @@ int main(int argc, char **argv)
        case CMD_HELP:
                list_attributes(dev);
                break;
+       case CMD_SHOW:
+               if (cport >= 0 || cvlan >= 0) {
+                       if (cport >= 0)
+                               show_port(dev, cport);
+                       else
+                               show_vlan(dev, cvlan);
+               } else {
+                       show_global(dev);
+                       for (i=0; i < dev->ports; i++)
+                               show_port(dev, i);
+                       for (i=0; i < dev->vlans; i++)
+                               show_vlan(dev, i);
+               }
+               break;
        }
 
 out: