summaryrefslogtreecommitdiff
path: root/networking
diff options
context:
space:
mode:
authorBernhard Reutner-Fischer <rep.dot.nop@gmail.com>2007-04-12 11:36:56 +0000
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>2007-04-12 11:36:56 +0000
commitc98c31783c062377d14b80735b056cf4c53c66e9 (patch)
tree900f4dbd061b9f27ba58f1ab7be478a9ce170093 /networking
parentb290889f0265e1278e8a868aa82a65bcc9099b0f (diff)
downloadbusybox-w32-c98c31783c062377d14b80735b056cf4c53c66e9.tar.gz
busybox-w32-c98c31783c062377d14b80735b056cf4c53c66e9.tar.bz2
busybox-w32-c98c31783c062377d14b80735b056cf4c53c66e9.zip
- shrink iproute a bit (-200 bytes). Untested
Diffstat (limited to 'networking')
-rw-r--r--networking/libiproute/iproute.c143
-rw-r--r--networking/libiproute/utils.c2
-rw-r--r--networking/libiproute/utils.h2
3 files changed, 84 insertions, 63 deletions
diff --git a/networking/libiproute/iproute.c b/networking/libiproute/iproute.c
index e7ad7d9c4..d5d9c1cfc 100644
--- a/networking/libiproute/iproute.c
+++ b/networking/libiproute/iproute.c
@@ -306,10 +306,23 @@ static int iproute_modify(int cmd, unsigned flags, int argc, char **argv)
306 struct rtattr * mxrta = (void*)mxbuf; 306 struct rtattr * mxrta = (void*)mxbuf;
307 unsigned mxlock = 0; 307 unsigned mxlock = 0;
308 char *d = NULL; 308 char *d = NULL;
309 int gw_ok = 0; 309 enum { gw_ok = 1<<0, dst_ok = 1<<1, proto_ok = 1<<2, type_ok = 1<<3};
310 int dst_ok = 0; 310 smalluint ok = 0;
311 int proto_ok = 0; 311 static const char * const keywords[] = {
312 int type_ok = 0; 312 "src", "via", "mtu", "lock", "protocol", "table", "dev", "oif", "to",
313 NULL
314 };
315 enum {
316 ARG_src,
317 ARG_via,
318 ARG_mtu, PARM_lock,
319 ARG_protocol,
320 ARG_table,
321 ARG_dev,
322 ARG_oif,
323 ARG_to
324 };
325 int arg;
313 326
314 memset(&req, 0, sizeof(req)); 327 memset(&req, 0, sizeof(req));
315 328
@@ -330,69 +343,64 @@ static int iproute_modify(int cmd, unsigned flags, int argc, char **argv)
330 mxrta->rta_len = RTA_LENGTH(0); 343 mxrta->rta_len = RTA_LENGTH(0);
331 344
332 while (argc > 0) { 345 while (argc > 0) {
333 if (strcmp(*argv, "src") == 0) { 346 arg = index_in_substr_array(keywords, *argv);
347 if (arg == ARG_src) {
334 inet_prefix addr; 348 inet_prefix addr;
335 NEXT_ARG(); 349 NEXT_ARG();
336 get_addr(&addr, *argv, req.r.rtm_family); 350 get_addr(&addr, *argv, req.r.rtm_family);
337 if (req.r.rtm_family == AF_UNSPEC) { 351 if (req.r.rtm_family == AF_UNSPEC)
338 req.r.rtm_family = addr.family; 352 req.r.rtm_family = addr.family;
339 }
340 addattr_l(&req.n, sizeof(req), RTA_PREFSRC, &addr.data, addr.bytelen); 353 addattr_l(&req.n, sizeof(req), RTA_PREFSRC, &addr.data, addr.bytelen);
341 } else if (strcmp(*argv, "via") == 0) { 354 } else if (arg == ARG_via) {
342 inet_prefix addr; 355 inet_prefix addr;
343 gw_ok = 1; 356 ok |= gw_ok;
344 NEXT_ARG(); 357 NEXT_ARG();
345 get_addr(&addr, *argv, req.r.rtm_family); 358 get_addr(&addr, *argv, req.r.rtm_family);
346 if (req.r.rtm_family == AF_UNSPEC) { 359 if (req.r.rtm_family == AF_UNSPEC) {
347 req.r.rtm_family = addr.family; 360 req.r.rtm_family = addr.family;
348 } 361 }
349 addattr_l(&req.n, sizeof(req), RTA_GATEWAY, &addr.data, addr.bytelen); 362 addattr_l(&req.n, sizeof(req), RTA_GATEWAY, &addr.data, addr.bytelen);
350 } else if (strcmp(*argv, "mtu") == 0) { 363 } else if (arg == ARG_mtu) {
351 unsigned mtu; 364 unsigned mtu;
352 NEXT_ARG(); 365 NEXT_ARG();
353 if (strcmp(*argv, "lock") == 0) { 366 if (index_in_str_array(keywords, *argv) == PARM_lock) {
354 mxlock |= (1<<RTAX_MTU); 367 mxlock |= (1<<RTAX_MTU);
355 NEXT_ARG(); 368 NEXT_ARG();
356 } 369 }
357 if (get_unsigned(&mtu, *argv, 0)) { 370 if (get_unsigned(&mtu, *argv, 0))
358 invarg(*argv, "mtu"); 371 invarg(*argv, "mtu");
359 }
360 rta_addattr32(mxrta, sizeof(mxbuf), RTAX_MTU, mtu); 372 rta_addattr32(mxrta, sizeof(mxbuf), RTAX_MTU, mtu);
361 } else if (matches(*argv, "protocol") == 0) { 373 } else if (arg == ARG_protocol) {
362 uint32_t prot; 374 uint32_t prot;
363 NEXT_ARG(); 375 NEXT_ARG();
364 if (rtnl_rtprot_a2n(&prot, *argv)) 376 if (rtnl_rtprot_a2n(&prot, *argv))
365 invarg(*argv, "protocol"); 377 invarg(*argv, "protocol");
366 req.r.rtm_protocol = prot; 378 req.r.rtm_protocol = prot;
367 proto_ok =1; 379 ok |= proto_ok;
368#if ENABLE_FEATURE_IP_RULE 380 } else if (arg == ARG_table) {
369 } else if (matches(*argv, "table") == 0) {
370 uint32_t tid; 381 uint32_t tid;
371 NEXT_ARG(); 382 NEXT_ARG();
372 if (rtnl_rttable_a2n(&tid, *argv)) 383 if (rtnl_rttable_a2n(&tid, *argv))
373 invarg(*argv, "table"); 384 invarg(*argv, "table");
374 req.r.rtm_table = tid; 385 req.r.rtm_table = tid;
375#endif 386 } else if (arg == ARG_dev || arg == ARG_oif) {
376 } else if (strcmp(*argv, "dev") == 0 ||
377 strcmp(*argv, "oif") == 0) {
378 NEXT_ARG(); 387 NEXT_ARG();
379 d = *argv; 388 d = *argv;
380 } else { 389 } else {
381 int type; 390 int type;
382 inet_prefix dst; 391 inet_prefix dst;
383 392
384 if (strcmp(*argv, "to") == 0) { 393 if (arg == ARG_to) {
385 NEXT_ARG(); 394 NEXT_ARG();
386 } 395 }
387 if ((**argv < '0' || **argv > '9') 396 if ((**argv < '0' || **argv > '9')
388 && rtnl_rtntype_a2n(&type, *argv) == 0 397 && rtnl_rtntype_a2n(&type, *argv) == 0) {
389 ) {
390 NEXT_ARG(); 398 NEXT_ARG();
391 req.r.rtm_type = type; 399 req.r.rtm_type = type;
392 type_ok = 1; 400 ok |= type_ok;
393 } 401 }
394 402
395 if (dst_ok) { 403 if (ok & dst_ok) {
396 duparg2("to", *argv); 404 duparg2("to", *argv);
397 } 405 }
398 get_prefix(&dst, *argv, req.r.rtm_family); 406 get_prefix(&dst, *argv, req.r.rtm_family);
@@ -400,7 +408,7 @@ static int iproute_modify(int cmd, unsigned flags, int argc, char **argv)
400 req.r.rtm_family = dst.family; 408 req.r.rtm_family = dst.family;
401 } 409 }
402 req.r.rtm_dst_len = dst.bitlen; 410 req.r.rtm_dst_len = dst.bitlen;
403 dst_ok = 1; 411 ok |= dst_ok;
404 if (dst.bytelen) { 412 if (dst.bytelen) {
405 addattr_l(&req.n, sizeof(req), RTA_DST, &dst.data, dst.bytelen); 413 addattr_l(&req.n, sizeof(req), RTA_DST, &dst.data, dst.bytelen);
406 } 414 }
@@ -427,6 +435,7 @@ static int iproute_modify(int cmd, unsigned flags, int argc, char **argv)
427 } 435 }
428 addattr_l(&req.n, sizeof(req), RTA_METRICS, RTA_DATA(mxrta), RTA_PAYLOAD(mxrta)); 436 addattr_l(&req.n, sizeof(req), RTA_METRICS, RTA_DATA(mxrta), RTA_PAYLOAD(mxrta));
429 } 437 }
438
430 if (req.r.rtm_type == RTN_LOCAL || req.r.rtm_type == RTN_NAT) 439 if (req.r.rtm_type == RTN_LOCAL || req.r.rtm_type == RTN_NAT)
431 req.r.rtm_scope = RT_SCOPE_HOST; 440 req.r.rtm_scope = RT_SCOPE_HOST;
432 else if (req.r.rtm_type == RTN_BROADCAST || 441 else if (req.r.rtm_type == RTN_BROADCAST ||
@@ -436,7 +445,7 @@ static int iproute_modify(int cmd, unsigned flags, int argc, char **argv)
436 else if (req.r.rtm_type == RTN_UNICAST || req.r.rtm_type == RTN_UNSPEC) { 445 else if (req.r.rtm_type == RTN_UNICAST || req.r.rtm_type == RTN_UNSPEC) {
437 if (cmd == RTM_DELROUTE) 446 if (cmd == RTM_DELROUTE)
438 req.r.rtm_scope = RT_SCOPE_NOWHERE; 447 req.r.rtm_scope = RT_SCOPE_NOWHERE;
439 else if (!gw_ok) 448 else if (!(ok & gw_ok))
440 req.r.rtm_scope = RT_SCOPE_LINK; 449 req.r.rtm_scope = RT_SCOPE_LINK;
441 } 450 }
442 451
@@ -504,7 +513,21 @@ static int iproute_list_or_flush(int argc, char **argv, int flush)
504 struct rtnl_handle rth; 513 struct rtnl_handle rth;
505 char *id = NULL; 514 char *id = NULL;
506 char *od = NULL; 515 char *od = NULL;
507 516 static const char * const keywords[] = {
517 "protocol", "all", "dev", "oif", "iif", "via", "table", "cache",/*all,*/
518 "from", "root", "match", "exact", "to", /*root,match,exact*/ NULL
519 };
520 enum {
521 ARG_proto, PARM_all,
522 ARG_dev,
523 ARG_oif,
524 ARG_iif,
525 ARG_via,
526 ARG_table, PARM_cache, /*PARM_all,*/
527 ARG_from, PARM_root, PARM_match, PARM_exact,
528 ARG_to /*PARM_root, PARM_match, PARM_exact*/
529 };
530 int arg, parm;
508 iproute_reset_filter(); 531 iproute_reset_filter();
509 filter.tb = RT_TABLE_MAIN; 532 filter.tb = RT_TABLE_MAIN;
510 533
@@ -512,67 +535,66 @@ static int iproute_list_or_flush(int argc, char **argv, int flush)
512 bb_error_msg_and_die(bb_msg_requires_arg, "\"ip route flush\""); 535 bb_error_msg_and_die(bb_msg_requires_arg, "\"ip route flush\"");
513 536
514 while (argc > 0) { 537 while (argc > 0) {
515 if (matches(*argv, "protocol") == 0) { 538 arg = index_in_substr_array(keywords, *argv);
539 if (arg == ARG_proto) {
516 uint32_t prot = 0; 540 uint32_t prot = 0;
517 NEXT_ARG(); 541 NEXT_ARG();
518 filter.protocolmask = -1; 542 filter.protocolmask = -1;
519 if (rtnl_rtprot_a2n(&prot, *argv)) { 543 if (rtnl_rtprot_a2n(&prot, *argv)) {
520 if (strcmp(*argv, "all") != 0) { 544 if (index_in_str_array(keywords, *argv) != PARM_all)
521 invarg(*argv, "protocol"); 545 invarg(*argv, "protocol");
522 }
523 prot = 0; 546 prot = 0;
524 filter.protocolmask = 0; 547 filter.protocolmask = 0;
525 } 548 }
526 filter.protocol = prot; 549 filter.protocol = prot;
527 } else if (strcmp(*argv, "dev") == 0 || 550 } else if (arg == ARG_dev || arg == ARG_oif) {
528 strcmp(*argv, "oif") == 0) {
529 NEXT_ARG(); 551 NEXT_ARG();
530 od = *argv; 552 od = *argv;
531 } else if (strcmp(*argv, "iif") == 0) { 553 } else if (arg == ARG_iif) {
532 NEXT_ARG(); 554 NEXT_ARG();
533 id = *argv; 555 id = *argv;
534 } else if (matches(*argv, "from") == 0) { 556 } else if (arg == ARG_via) {
535 NEXT_ARG(); 557 NEXT_ARG();
536 if (matches(*argv, "root") == 0) { 558 get_prefix(&filter.rvia, *argv, do_ipv6);
559 } else if (arg == ARG_table) {
560 NEXT_ARG();
561 parm = index_in_substr_array(keywords, *argv);
562 if (parm == PARM_cache)
563 filter.tb = -1;
564 else if (parm == PARM_all)
565 filter.tb = 0;
566 else
567 invarg(*argv, "table");
568 } else if (arg == ARG_from) {
569 NEXT_ARG();
570 parm = index_in_substr_array(keywords, *argv);
571 if (parm == PARM_root) {
537 NEXT_ARG(); 572 NEXT_ARG();
538 get_prefix(&filter.rsrc, *argv, do_ipv6); 573 get_prefix(&filter.rsrc, *argv, do_ipv6);
539 } else if (matches(*argv, "match") == 0) { 574 } else if (parm == PARM_match) {
540 NEXT_ARG(); 575 NEXT_ARG();
541 get_prefix(&filter.msrc, *argv, do_ipv6); 576 get_prefix(&filter.msrc, *argv, do_ipv6);
542 } else { 577 } else {
543 if (matches(*argv, "exact") == 0) { 578 if (parm == PARM_exact)
544 NEXT_ARG(); 579 NEXT_ARG();
545 }
546 get_prefix(&filter.msrc, *argv, do_ipv6); 580 get_prefix(&filter.msrc, *argv, do_ipv6);
547 filter.rsrc = filter.msrc; 581 filter.rsrc = filter.msrc;
548 } 582 }
549 } else { 583 } else {
550 if (matches(*argv, "to") == 0) { 584 /* parm = arg; // would be more plausible, we reuse arg here */
585 if (arg == ARG_to) {
551 NEXT_ARG(); 586 NEXT_ARG();
587 arg = index_in_substr_array(keywords, *argv);
552 } 588 }
553 if (matches(*argv, "root") == 0) { 589 if (arg == PARM_root) {
554 NEXT_ARG(); 590 NEXT_ARG();
555 get_prefix(&filter.rdst, *argv, do_ipv6); 591 get_prefix(&filter.rdst, *argv, do_ipv6);
556 } else if (matches(*argv, "match") == 0) { 592 } else if (arg == PARM_match) {
557 NEXT_ARG(); 593 NEXT_ARG();
558 get_prefix(&filter.mdst, *argv, do_ipv6); 594 get_prefix(&filter.mdst, *argv, do_ipv6);
559 } else if (matches(*argv, "table") == 0) {
560 NEXT_ARG();
561 if (matches(*argv, "cache") == 0) {
562 filter.tb = -1;
563#if 0 && ENABLE_FEATURE_IP_RULE
564
565#else
566 } else if (matches(*argv, "main") != 0) {
567 invarg(*argv, "table");
568 }
569#endif
570 } else if (matches(*argv, "cache") == 0) {
571 filter.tb = -1;
572 } else { 595 } else {
573 if (matches(*argv, "exact") == 0) { 596 if (arg == PARM_exact)
574 NEXT_ARG(); 597 NEXT_ARG();
575 }
576 get_prefix(&filter.mdst, *argv, do_ipv6); 598 get_prefix(&filter.mdst, *argv, do_ipv6);
577 filter.rdst = filter.mdst; 599 filter.rdst = filter.mdst;
578 } 600 }
@@ -655,8 +677,8 @@ static int iproute_get(int argc, char **argv)
655 } req; 677 } req;
656 char *idev = NULL; 678 char *idev = NULL;
657 char *odev = NULL; 679 char *odev = NULL;
658 int connected = 0; 680 bool connected = 0;
659 int from_ok = 0; 681 bool from_ok = 0;
660 static const char * const options[] = 682 static const char * const options[] =
661 { "from", "iif", "oif", "dev", "notify", "connected", "to", 0 }; 683 { "from", "iif", "oif", "dev", "notify", "connected", "to", 0 };
662 684
@@ -722,8 +744,7 @@ static int iproute_get(int argc, char **argv)
722 } 744 }
723 req.r.rtm_dst_len = addr.bitlen; 745 req.r.rtm_dst_len = addr.bitlen;
724 } 746 }
725 argc--; 747 argc--; argv++;
726 argv++;
727 } 748 }
728 } 749 }
729 750
diff --git a/networking/libiproute/utils.c b/networking/libiproute/utils.c
index 601e45bb4..9605c39db 100644
--- a/networking/libiproute/utils.c
+++ b/networking/libiproute/utils.c
@@ -29,7 +29,7 @@ int get_integer(int *val, char *arg, int base)
29 *val = res; 29 *val = res;
30 return 0; 30 return 0;
31} 31}
32 32//XXX: FIXME: use some libbb function instead
33int get_unsigned(unsigned *val, char *arg, int base) 33int get_unsigned(unsigned *val, char *arg, int base)
34{ 34{
35 unsigned long res; 35 unsigned long res;
diff --git a/networking/libiproute/utils.h b/networking/libiproute/utils.h
index f76ad124d..3b6fef1e3 100644
--- a/networking/libiproute/utils.h
+++ b/networking/libiproute/utils.h
@@ -78,7 +78,7 @@ extern const char *rt_addr_n2a(int af, int len, void *addr, char *buf, int bufle
78void invarg(const char *, const char *) ATTRIBUTE_NORETURN; 78void invarg(const char *, const char *) ATTRIBUTE_NORETURN;
79void duparg(const char *, const char *) ATTRIBUTE_NORETURN; 79void duparg(const char *, const char *) ATTRIBUTE_NORETURN;
80void duparg2(const char *, const char *) ATTRIBUTE_NORETURN; 80void duparg2(const char *, const char *) ATTRIBUTE_NORETURN;
81int /*ATTRIBUTE_DEPRECATED*/ matches(const char *arg, const char *pattern); 81int ATTRIBUTE_DEPRECATED matches(const char *arg, const char *pattern);
82int inet_addr_match(inet_prefix *a, inet_prefix *b, int bits); 82int inet_addr_match(inet_prefix *a, inet_prefix *b, int bits);
83 83
84const char *dnet_ntop(int af, const void *addr, char *str, size_t len); 84const char *dnet_ntop(int af, const void *addr, char *str, size_t len);