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 */