-
-bool do_vlan_8021q_set (int nb, const char **com, 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;
-
-
- if ( nb==0 ) {
- printf("Usage: vlan 802.1q set <vlan> [all unspec|no|untagged|tagged] [<port1> unspec|no|untagged|tagged ...]\n");
- ret=false;
- goto end;
- }
-
- if ( (sa=ngadmin_getCurrentSwitch(nga))==NULL ) {
- printf("must be logged\n");
- ret=false;
- goto end;
- }
-
- // read vlan
- vlan=strtoul(com[k++], NULL, 0);
-
- if ( vlan<1 || vlan>VLAN_MAX ) {
- printf("vlan out of range\n");
- ret=false;
- goto end;
- }
-
-
- // read defaults
- if ( k<nb-1 && strcasecmp(com[k], "all")==0 ) {
- ++k;
- if ( strcasecmp(com[k], "tagged")==0 ) def=VLAN_TAGGED;
- else if ( strcasecmp(com[k], "untagged")==0 ) def=VLAN_UNTAGGED;
- else if ( strcasecmp(com[k], "no")==0 ) def=VLAN_NO;
- else if ( strcasecmp(com[k], "unspec")==0 ) def=VLAN_UNSPEC;
- else {
- printf("incorrect type\n");
- ret=false;
- goto end;
- }
- ++k;
- }
-
- ports=malloc(sa->ports*sizeof(unsigned char));
-
- // apply defaults
- memset(ports, def, sa->ports);
-
- // apply port specifics
- while ( k<nb-1 ) {
- p=strtoul(com[k++], NULL, 0)-1;
- if ( p>=sa->ports ) {
- printf("port out of range\n");
- ret=false;
- goto end;
- }
- if ( strcasecmp(com[k], "tagged")==0 ) ports[p]=VLAN_TAGGED;
- else if ( strcasecmp(com[k], "untagged")==0 ) ports[p]=VLAN_UNTAGGED;
- else if ( strcasecmp(com[k], "no")==0 ) ports[p]=VLAN_NO;
- else if ( strcasecmp(com[k], "unspec")==0 ) ports[p]=VLAN_UNSPEC;
- else {
- printf("incorrect type\n");
- ret=false;
- goto end;
- }
- ++k;
- }
-
-
- // set conf
- i=ngadmin_setVLANDotConf(nga, vlan, ports);
- printErrCode(i);
-
-
- end:
- free(ports);
-
-
- return ret;
-
+bool do_vlan_8021q_set (int nb, const char **com, 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;
+
+
+ if (nb == 0) {
+ printf("Usage: vlan 802.1q set <vlan> [all unspec|no|untagged|tagged] [<port1> unspec|no|untagged|tagged ...]\n");
+ ret = false;
+ goto end;
+ }
+
+ sa = ngadmin_getCurrentSwitch(nga);
+ if (sa == NULL) {
+ printf("must be logged\n");
+ ret = false;
+ goto end;
+ }
+
+ /* read vlan */
+ vlan = strtoul(com[k++], NULL, 0);
+
+ if (vlan < 1 || vlan > VLAN_MAX) {
+ printf("vlan out of range\n");
+ ret = false;
+ goto end;
+ }
+
+ /* read defaults */
+ if (k < nb - 1 && strcasecmp(com[k], "all") == 0) {
+ k++;
+ if (strcasecmp(com[k], "tagged") == 0) {
+ def = VLAN_TAGGED;
+ } else if (strcasecmp(com[k], "untagged") == 0) {
+ def = VLAN_UNTAGGED;
+ } else if (strcasecmp(com[k], "no") == 0) {
+ def = VLAN_NO;
+ } else if (strcasecmp(com[k], "unspec") == 0) {
+ def = VLAN_UNSPEC;
+ } else {
+ printf("incorrect type\n");
+ ret = false;
+ goto end;
+ }
+ k++;
+ }
+
+ ports = malloc(sa->ports * sizeof(unsigned char));
+
+ /* apply defaults */
+ memset(ports, def, sa->ports);
+
+ /* apply port specifics */
+ while (k < nb - 1) {
+ p = strtoul(com[k++], NULL, 0) - 1;
+ if (p >= sa->ports) {
+ printf("port out of range\n");
+ ret = false;
+ goto end;
+ }
+ if (strcasecmp(com[k], "tagged") ==0) {
+ ports[p] = VLAN_TAGGED;
+ } else if (strcasecmp(com[k], "untagged") == 0) {
+ ports[p] = VLAN_UNTAGGED;
+ } else if (strcasecmp(com[k], "no") == 0) {
+ ports[p] = VLAN_NO;
+ } else if (strcasecmp(com[k], "unspec") == 0) {
+ ports[p] = VLAN_UNSPEC;
+ } else {
+ printf("incorrect type\n");
+ ret = false;
+ goto end;
+ }
+ k++;
+ }
+
+ /* set conf */
+ i = ngadmin_setVLANDotConf(nga, vlan, ports);
+ printErrCode(i);
+
+end:
+ free(ports);
+
+ return ret;