]> git.sur5r.net Git - ngadmin/blobdiff - cli/com_vlan.c
Cli: fix crash when interrupting an automatic login attempt
[ngadmin] / cli / com_vlan.c
index f70a6c941b411ea8c487563ca84d84ab075377cf..0baa1d5d0c32699d02278abe95c0e490a52974b9 100644 (file)
@@ -22,7 +22,7 @@ static char vlan_char (int t)
 }
 
 
-bool do_vlan_8021q_del (int argc, const char **argv, struct ngadmin *nga)
+int do_vlan_8021q_del (int argc, const char **argv, struct ngadmin *nga)
 {
        const struct swi_attr *sa;
        unsigned short vlan;
@@ -31,57 +31,177 @@ bool do_vlan_8021q_del (int argc, const char **argv, struct ngadmin *nga)
        
        if (argc != 1) {
                printf("usage: vlan 8021q del <vlan>\n");
-               return false;
+               return 1;
        }
        
        sa = ngadmin_getCurrentSwitch(nga);
        if (sa == NULL) {
                printf("must be logged\n");
-               return false;
+               return 1;
        }
        
        vlan=strtoul(argv[0], NULL, 0);
-       if (vlan < 1 || vlan > VLAN_MAX) {
+       if (vlan < VLAN_MIN || vlan > VLAN_DOT_MAX) {
                printf("vlan out of range\n");
-               return false;
+               return 1;
        }
        
        i = ngadmin_VLANDestroy(nga, vlan);
        printErrCode(i);
        
        
-       return true;
+       return 0;
 }
 
 
-bool do_vlan_8021q_set (int argc, const char **argv, struct ngadmin *nga)
+int do_vlan_port_set (int argc, const char **argv, struct ngadmin *nga)
+{
+       unsigned char vlan, port, *ports = NULL;
+       const struct swi_attr *sa;
+       int i, k = 0, ret = 0;
+       
+       
+       if (argc < 2) {
+               printf("usage: vlan port set [all <vlan>] [<port1> <vlan>] [<port2> <vlan>] [...]\n");
+               ret = 1;
+               goto end;
+       }
+       
+       sa = ngadmin_getCurrentSwitch(nga);
+       if (sa == NULL) {
+               printf("must be logged\n");
+               ret = 1;
+               goto end;
+       }
+       
+       ports = malloc(sa->ports * sizeof(unsigned char));
+
+       /* read defaults */
+       vlan = 0;
+       if (strcmp(argv[k], "all") == 0) {
+               k++;
+               vlan = strtoul(argv[k++], NULL, 0);
+               /* VLAN 0 is allowed and means no change */
+               if (vlan > VLAN_PORT_MAX) {
+                       printf("vlan out of range\n");
+                       ret = 1;
+                       goto end;
+               }
+       }
+       
+       /* apply defaults */
+       memset(ports, vlan, sa->ports);
+       
+       /* read and apply port specifics */
+       while (k < argc - 1) {
+               /* read port */
+               port = strtoul(argv[k++], NULL, 0);
+               if (port < 1 || port > sa->ports) {
+                       printf("port out of range\n");
+                       ret = 1;
+                       goto end;
+               }
+               
+               /* read vlan */
+               vlan = strtoul(argv[k++], NULL, 0);
+               /* VLAN 0 is allowed and means no change */
+               if (vlan > VLAN_PORT_MAX) {
+                       printf("vlan out of range\n");
+                       ret = 1;
+                       goto end;
+               }
+               
+               ports[port - 1] = vlan;
+       }
+       
+       /* set conf */
+       i = ngadmin_setVLANPortConf(nga, ports);
+       printErrCode(i);
+       
+end:
+       free(ports);
+       
+       return ret;
+}
+
+
+int do_vlan_port_show (int argc, const char **argv UNUSED, struct ngadmin *nga)
+{
+       unsigned char *ports = NULL;
+       const struct swi_attr *sa;
+       int i, ret = 0;
+       
+       
+       if (argc > 0) {
+               printf("this command takes no argument\n");
+               ret = 1;
+               goto end;
+       }
+       
+       sa = ngadmin_getCurrentSwitch(nga);
+       if (sa == NULL) {
+               printf("must be logged\n");
+               ret = 1;
+               goto end;
+       }
+       
+       ports = malloc(sa->ports * sizeof(unsigned char));
+       
+       /* request all VLANs config */
+       i = ngadmin_getVLANPortConf(nga, ports);
+       
+       if (i != ERR_OK) {
+               printErrCode(i);
+               ret = 1;
+               goto end;
+       }
+       
+       printf("Ports configuration: \n");
+       printf("Port\t");
+       for (i = 1; i <= sa->ports; i++)
+               printf("%i\t", i);
+       putchar('\n');
+       
+       /* show all VLANs */
+       printf("VLAN\t");
+       for (i = 0; i < sa->ports; i++)
+               printf("%u\t", ports[i]);
+       putchar('\n');
+       
+end:
+       free(ports);
+       
+       return ret;
+}
+
+
+int do_vlan_8021q_set (int argc, const char **argv, struct ngadmin *nga)
 {
        unsigned char *ports = NULL, p, def = VLAN_UNSPEC;
        const struct swi_attr *sa;
-       bool ret = true;
        unsigned short vlan;
-       int i, k = 0;
+       int i, k = 0, ret = 0;
        
        
        if (argc == 0) {
                printf("usage: vlan 802.1q set <vlan> [all unspec|no|untagged|tagged] [<port1> unspec|no|untagged|tagged ...]\n");
-               ret = false;
+               ret = 1;
                goto end;
        }
        
        sa = ngadmin_getCurrentSwitch(nga);
        if (sa == NULL) {
                printf("must be logged\n");
-               ret = false;
+               ret = 1;
                goto end;
        }
        
        /* read vlan */
        vlan = strtoul(argv[k++], NULL, 0);
        
-       if (vlan < 1 || vlan > VLAN_MAX) {
+       if (vlan < VLAN_MIN || vlan > VLAN_DOT_MAX) {
                printf("vlan out of range\n");
-               ret = false;
+               ret = 1;
                goto end;
        }
        
@@ -98,7 +218,7 @@ bool do_vlan_8021q_set (int argc, const char **argv, struct ngadmin *nga)
                        def = VLAN_UNSPEC;
                } else {
                        printf("incorrect type\n");
-                       ret = false;
+                       ret = 1;
                        goto end;
                }
                k++;
@@ -109,12 +229,12 @@ bool do_vlan_8021q_set (int argc, const char **argv, struct ngadmin *nga)
        /* apply defaults */
        memset(ports, def, sa->ports);
        
-       /* apply port specifics */
+       /* read and apply port specifics */
        while (k < argc - 1) {
                p = strtoul(argv[k++], NULL, 0) - 1;
                if (p >= sa->ports) {
                        printf("port out of range\n");
-                       ret = false;
+                       ret = 1;
                        goto end;
                }
                if (strcasecmp(argv[k], "tagged") ==0) {
@@ -127,7 +247,7 @@ bool do_vlan_8021q_set (int argc, const char **argv, struct ngadmin *nga)
                        ports[p] = VLAN_UNSPEC;
                } else {
                        printf("incorrect type\n");
-                       ret = false;
+                       ret = 1;
                        goto end;
                }
                k++;
@@ -144,19 +264,18 @@ end:
 }
 
 
-bool do_vlan_8021q_show (int argc, const char **argv, struct ngadmin *nga)
+int do_vlan_8021q_show (int argc, const char **argv, struct ngadmin *nga)
 {
        unsigned short vl = 0, *vlans = NULL;
        unsigned char *ports = NULL;
        const struct swi_attr *sa;
-       int i, j, n = 16;
-       bool ret = true;
+       int i, j, n = 16, ret = 0;
        
        
        sa = ngadmin_getCurrentSwitch(nga);
        if (sa == NULL) {
                printf("must be logged\n");
-               ret = false;
+               ret = 1;
                goto end;
        }
        
@@ -178,7 +297,7 @@ bool do_vlan_8021q_show (int argc, const char **argv, struct ngadmin *nga)
        
        if (i != ERR_OK) {
                printErrCode(i);
-               ret = false;
+               ret = 1;
                goto end;
        }
        
@@ -212,7 +331,7 @@ end:
 }
 
 
-bool do_vlan_mode_set (int argc, const char **argv, struct ngadmin *nga)
+int do_vlan_mode_set (int argc, const char **argv, struct ngadmin *nga)
 {
        int mode, i;
        
@@ -220,54 +339,55 @@ bool do_vlan_mode_set (int argc, const char **argv, struct ngadmin *nga)
        if (argc == 0) {
                printf(
                "usage: vlan mode set <mode>\n"
+               "0 - disabled\n"
                "1 - basic port based\n"
                "2 - advanced port based\n"
                "3 - basic 802.1Q\n"
                "4 - advanced 802.1Q\n"
                );
-               return true;
+               return 0;
        }
        
        if (ngadmin_getCurrentSwitch(nga) == NULL) {
                printf("must be logged\n");
-               return false;
+               return 1;
        }
        
        mode = strtoul(argv[0], NULL, 0);
-       if (mode < 1 || mode > 4) {
+       if (mode < VLAN_DISABLED || mode > VLAN_DOT_ADV) {
                printf("mode out of range\n");
-               return false;
+               return 1;
        }
        
        i = ngadmin_setVLANType(nga, mode);
        printErrCode(i);
        
        
-       return true;
+       return 0;
 }
 
 
-bool do_vlan_mode_show (int argc, const char **argv UNUSED, struct ngadmin *nga)
+int do_vlan_mode_show (int argc, const char **argv UNUSED, struct ngadmin *nga)
 {
-       int i, t, ret = true;
+       int i, t, ret = 0;
        
        
        if (argc > 0) {
                printf("this command takes no argument\n");
-               ret = false;
+               ret = 1;
                goto end;
        }
        
        if (ngadmin_getCurrentSwitch(nga) == NULL) {
                printf("must be logged\n");
-               ret = false;
+               ret = 1;
                goto end;
        }
        
        i = ngadmin_getVLANType(nga, &t);
        if (i != ERR_OK) {
                printErrCode(i);
-               ret = false;
+               ret = 1;
                goto end;
        }
        
@@ -304,7 +424,7 @@ end:
 }
 
 
-bool do_vlan_pvid_set (int argc, const char **argv, struct ngadmin *nga)
+int do_vlan_pvid_set (int argc, const char **argv, struct ngadmin *nga)
 {
        const struct swi_attr *sa;
        unsigned char port;
@@ -314,13 +434,13 @@ bool do_vlan_pvid_set (int argc, const char **argv, struct ngadmin *nga)
        
        if (argc != 2) {
                printf("usage: vlan pvid set <port> <vlan>\n");
-               return false;
+               return 1;
        }
        
        sa = ngadmin_getCurrentSwitch(nga);
        if (sa == NULL) {
                printf("must be logged\n");
-               return false;
+               return 1;
        }
        
        port = strtoul(argv[0], NULL, 0);
@@ -328,40 +448,39 @@ bool do_vlan_pvid_set (int argc, const char **argv, struct ngadmin *nga)
        
        if (port < 1 || port > sa->ports) {
                printf("port out of range\n");
-               return false;
+               return 1;
        }
        
-       if (vlan < 1 || vlan > VLAN_MAX) {
+       if (vlan < VLAN_MIN || vlan > VLAN_DOT_MAX) {
                printf("vlan out of range\n");
-               return false;
+               return 1;
        }
        
        i = ngadmin_setPVID(nga, port, vlan);
        printErrCode(i);
        
        
-       return true;
+       return 0;
 }
 
 
-bool do_vlan_pvid_show (int argc, const char **argv UNUSED, struct ngadmin *nga)
+int do_vlan_pvid_show (int argc, const char **argv UNUSED, struct ngadmin *nga)
 {
        unsigned short *ports = NULL;
        const struct swi_attr *sa;
-       int i;
-       bool ret = true;
+       int i, ret = 0;
        
        
        if (argc > 0) {
                printf("this command takes no argument\n");
-               ret = false;
+               ret = 1;
                goto end;
        }
        
        sa = ngadmin_getCurrentSwitch(nga);
        if (sa == NULL) {
                printf("must be logged\n");
-               ret = false;
+               ret = 1;
                goto end;
        }
        
@@ -369,7 +488,7 @@ bool do_vlan_pvid_show (int argc, const char **argv UNUSED, struct ngadmin *nga)
        i = ngadmin_getAllPVID(nga, ports);
        if (i != ERR_OK) {
                printErrCode(i);
-               ret = false;
+               ret = 1;
                goto end;
        }