]> rtime.felk.cvut.cz Git - can-utils.git/blobdiff - cegw.c
cegw: Simplify argument parsing
[can-utils.git] / cegw.c
diff --git a/cegw.c b/cegw.c
index 93f25bafd30aa7d557dc4ff4a8118a23316335f1..2df9ded85418f4cac69c94adcdb10771c3d174db 100644 (file)
--- a/cegw.c
+++ b/cegw.c
@@ -174,46 +174,43 @@ int main(int argc, char *argv[])
                return 1;
        }
 
+       /* Argument parsing */
+
+       /* can ifindex */
+       char *canif = argv[1];
+       nptr = strchr(canif, ',');
+       if (nptr)
+               *nptr = '\0';
+
+       can_addr.can_family = AF_CAN;
+       tmpi = if_nametoindex(canif);
+       if (tmpi == 0) {
+               perror(canif);
+               return 1;
+       }
+
+       can_addr.can_ifindex = tmpi;
+
+       /* listen addr */
+       readsockaddr(argv[2], udp_addr, AF_UNSPEC);
+       switch (udp_addr->sa_family) {
+       case AF_INET:
+               addrlen = sizeof(struct sockaddr_in);
+               break;
+       case AF_INET6:
+               addrlen = sizeof(struct sockaddr_in6);
+               break;
+       default:
+               fprintf(stderr, "%s: unexpected sockaddr family\n", argv[2]);
+               return 1;
+       }
        dstcnt = argc-3;
+       gwctl = (struct cegw_ioctl*)malloc(sizeof(*gwctl) + dstcnt*addrlen);
 
-       for (i=1; i<argc; i++) {
-               switch (i) {
-                       case 1: /* can ifindex */
-                               nptr = strchr(argv[i], ',');
-                               if (nptr) {
-                                       *nptr = '\0';
-                               }
-
-                               can_addr.can_family = AF_CAN;
-                               tmpi = if_nametoindex(argv[i]);
-                               if (tmpi == 0) {
-                                       perror(argv[i]);
-                                       return 1;
-                               }
-
-                               can_addr.can_ifindex = tmpi;
-                               break;
-                       case 2: /* listen addr */
-                               readsockaddr(argv[i], udp_addr, AF_UNSPEC);
-                               switch (udp_addr->sa_family) {
-                                       case AF_INET:
-                                               addrlen = sizeof(struct sockaddr_in);
-                                               break;
-                                       case AF_INET6:
-                                               addrlen = sizeof(struct sockaddr_in6);
-                                               break;
-                                       default:
-                                               fprintf(stderr, "unexpected sockaddr family");
-                                               break;
-                               }
-                               gwctl = (struct cegw_ioctl*)malloc(sizeof(*gwctl) + dstcnt*addrlen);
-                               break;
-                       default: /* udp destination */
-                               dst = (struct sockaddr *)(gwctl->udp_dst + (i-3)*addrlen);
-                               readsockaddr(argv[i], dst, udp_addr->sa_family);
-
-                               break;
-               }
+       /* udp destinations */
+       for (i=3; i < argc; i++) {
+               dst = (struct sockaddr *)(gwctl->udp_dst + (i-3)*addrlen);
+               readsockaddr(argv[i], dst, udp_addr->sa_family);
        }
 
        /* prepare udp socket */