diff options
| author | San Mehat <san@google.com> | 2009-05-14 15:12:43 -0700 |
|---|---|---|
| committer | The Android Open Source Project <initial-contribution@android.com> | 2009-05-14 15:12:43 -0700 |
| commit | a47c2fdd4aa27ddffcca61b2f7f3139d2ed73622 (patch) | |
| tree | 75fed9903f525a4096707edc9598647643240a1f /toolbox | |
| parent | cb1c9ef38c9db11db927096a45b10cda52786481 (diff) | |
| parent | c83cd879d45e667fbb4763f18c908928ee9d67d8 (diff) | |
| download | system_core-a47c2fdd4aa27ddffcca61b2f7f3139d2ed73622.tar.gz system_core-a47c2fdd4aa27ddffcca61b2f7f3139d2ed73622.tar.bz2 system_core-a47c2fdd4aa27ddffcca61b2f7f3139d2ed73622.zip | |
am c83cd879: init: Fix heap corruption for services with arguments
Merge commit 'c83cd879d45e667fbb4763f18c908928ee9d67d8'
* commit 'c83cd879d45e667fbb4763f18c908928ee9d67d8':
init: Fix heap corruption for services with arguments
toolbox: ifconfig: Implement mtu setting, plus setting interface addr should
toolbox: route: Reflow some of the mess, fix route add parameter names to
Diffstat (limited to 'toolbox')
| -rw-r--r-- | toolbox/ifconfig.c | 72 | ||||
| -rw-r--r-- | toolbox/route.c | 120 |
2 files changed, 102 insertions, 90 deletions
diff --git a/toolbox/ifconfig.c b/toolbox/ifconfig.c index dff183e8..80c0e5ce 100644 --- a/toolbox/ifconfig.c +++ b/toolbox/ifconfig.c @@ -28,26 +28,32 @@ static void setflags(int s, struct ifreq *ifr, int set, int clr) static inline void init_sockaddr_in(struct sockaddr_in *sin, const char *addr) { - sin->sin_family = AF_INET; - sin->sin_port = 0; - sin->sin_addr.s_addr = inet_addr(addr); + sin->sin_family = AF_INET; + sin->sin_port = 0; + sin->sin_addr.s_addr = inet_addr(addr); } +static void setmtu(int s, struct ifreq *ifr, const char *mtu) +{ + int m = atoi(mtu); + ifr->ifr_mtu = m; + if(ioctl(s, SIOCSIFMTU, ifr) < 0) die("SIOCSIFMTU"); +} static void setdstaddr(int s, struct ifreq *ifr, const char *addr) { - init_sockaddr_in((struct sockaddr_in *) &ifr->ifr_dstaddr, addr); + init_sockaddr_in((struct sockaddr_in *) &ifr->ifr_dstaddr, addr); if(ioctl(s, SIOCSIFDSTADDR, ifr) < 0) die("SIOCSIFDSTADDR"); } static void setnetmask(int s, struct ifreq *ifr, const char *addr) { - init_sockaddr_in((struct sockaddr_in *) &ifr->ifr_netmask, addr); + init_sockaddr_in((struct sockaddr_in *) &ifr->ifr_netmask, addr); if(ioctl(s, SIOCSIFNETMASK, ifr) < 0) die("SIOCSIFNETMASK"); } static void setaddr(int s, struct ifreq *ifr, const char *addr) { - init_sockaddr_in((struct sockaddr_in *) &ifr->ifr_addr, addr); + init_sockaddr_in((struct sockaddr_in *) &ifr->ifr_addr, addr); if(ioctl(s, SIOCSIFADDR, ifr) < 0) die("SIOCSIFADDR"); } @@ -115,41 +121,43 @@ int ifconfig_main(int argc, char *argv[]) running = (flags & IFF_RUNNING) ? " running" : ""; multi = (flags & IFF_MULTICAST) ? " multicast" : ""; printf("%s%s%s%s%s%s]\n", updown, brdcst, loopbk, ppp, running, multi); - - - -/* char *updown, *brdcst, *loopbk, *ppp, *running, *multi; */ - return 0; } - while(argc > 0){ - if(!strcmp(argv[0], "up")) { + while(argc > 0) { + if (!strcmp(argv[0], "up")) { setflags(s, &ifr, IFF_UP, 0); - } else if(!strcmp(argv[0], "-pointopoint")) { + } else if (!strcmp(argv[0], "mtu")) { + argc--, argv++; + if (!argc) { + errno = EINVAL; + die("expecting a value for parameter \"mtu\""); + } + setmtu(s, &ifr, argv[0]); + } else if (!strcmp(argv[0], "-pointopoint")) { setflags(s, &ifr, IFF_POINTOPOINT, 1); - } else if(!strcmp(argv[0], "pointopoint")) { - argc--, argv++; - if (0 == argc) { - errno = EINVAL; - die("expecting an IP address for parameter \"pointtopoint\""); - } - setdstaddr(s, &ifr, argv[0]); - setflags(s, &ifr, IFF_POINTOPOINT, 0); - } else if(!strcmp(argv[0], "down")) { + } else if (!strcmp(argv[0], "pointopoint")) { + argc--, argv++; + if (!argc) { + errno = EINVAL; + die("expecting an IP address for parameter \"pointtopoint\""); + } + setdstaddr(s, &ifr, argv[0]); + setflags(s, &ifr, IFF_POINTOPOINT, 0); + } else if (!strcmp(argv[0], "down")) { setflags(s, &ifr, 0, IFF_UP); - } else if(!strcmp(argv[0], "netmask")) { - argc--, argv++; - if (0 == argc) { - errno = EINVAL; - die("expecting an IP address for parameter \"netmask\""); - } - setnetmask(s, &ifr, argv[0]); - } else if(isdigit(argv[0][0])){ + } else if (!strcmp(argv[0], "netmask")) { + argc--, argv++; + if (!argc) { + errno = EINVAL; + die("expecting an IP address for parameter \"netmask\""); + } + setnetmask(s, &ifr, argv[0]); + } else if (isdigit(argv[0][0])) { setaddr(s, &ifr, argv[0]); + setflags(s, &ifr, IFF_UP, 0); } argc--, argv++; } - return 0; } diff --git a/toolbox/route.c b/toolbox/route.c index 86fc35b3..2fd71080 100644 --- a/toolbox/route.c +++ b/toolbox/route.c @@ -51,75 +51,79 @@ int route_main(int argc, char *argv[]) { struct ifreq ifr; int s,i; - struct rtentry rt; - struct sockaddr_in ina; + struct rtentry rt; + struct sockaddr_in ina; - if(argc == 0) return 0; - + if (!argc) + return 0; + strncpy(ifr.ifr_name, argv[0], IFNAMSIZ); ifr.ifr_name[IFNAMSIZ-1] = 0; - ADVANCE(argc, argv); + ADVANCE(argc, argv); - if((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { + if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { die("cannot open control socket\n"); } while(argc > 0){ - if(!strcmp(argv[0], "add")) { - EXPECT_NEXT(argc, argv); - if(!strcmp(argv[0], "default")) { - EXPECT_NEXT(argc, argv); - memset((char *) &rt, 0, sizeof(struct rtentry)); - rt.rt_dst.sa_family = AF_INET; - if(!strcmp(argv[0], "dev")) { - EXPECT_NEXT(argc, argv); - rt.rt_flags = RTF_UP | RTF_HOST; - rt.rt_dev = argv[0]; - if (ioctl(s, SIOCADDRT, &rt) < 0) die("SIOCADDRT\n"); - }else if(!strcmp(argv[0], "gw")) { - EXPECT_NEXT(argc, argv); - rt.rt_flags = RTF_UP | RTF_GATEWAY; - init_sockaddr_in((struct sockaddr_in *)&(rt.rt_genmask), "0.0.0.0"); - if(isdigit(argv[0][0])){ - init_sockaddr_in((struct sockaddr_in *)&(rt.rt_gateway), argv[0]); - }else{ - die("expecting an IP address for parameter \"gw\"\n"); - } - EXPECT_NEXT(argc, argv); - if(!strcmp(argv[0], "dev")) { - EXPECT_NEXT(argc, argv); - rt.rt_dev = argv[0]; - if (ioctl(s, SIOCADDRT, &rt) < 0){ - die("SIOCADDRT\n"); - } - } - } - } else { - char keywords[3][5] = { "net", "mask", "gw" }; - struct sockaddr_in *paddr[3] = { &rt.rt_dst, &rt.rt_genmask, &rt.rt_gateway }; - int k = 0; - - memset((char *) &rt, 0, sizeof(struct rtentry)); - rt.rt_flags = RTF_UP | RTF_GATEWAY; - do { - if(!strcmp(argv[0], keywords[k])) { - EXPECT_NEXT(argc, argv); - if(isdigit(argv[0][0])) { - init_sockaddr_in(paddr[k], argv[0]); - } else { - die("expecting an IP/MASK address for parameter %s\n", keywords[k]); - } - if(k < 2) EXPECT_NEXT(argc, argv); - } else { - die("expecting keyword(s)\n"); - } - } while(++k < 3); - if(ioctl(s, SIOCADDRT, &rt) < 0) { + if (!strcmp(argv[0], "add")) { + EXPECT_NEXT(argc, argv); + if (!strcmp(argv[0], "default")) { + EXPECT_NEXT(argc, argv); + memset((char *) &rt, 0, sizeof(struct rtentry)); + rt.rt_dst.sa_family = AF_INET; + if(!strcmp(argv[0], "dev")) { + EXPECT_NEXT(argc, argv); + rt.rt_flags = RTF_UP | RTF_HOST; + rt.rt_dev = argv[0]; + if (ioctl(s, SIOCADDRT, &rt) < 0) + die("SIOCADDRT\n"); + } else if (!strcmp(argv[0], "gw")) { + EXPECT_NEXT(argc, argv); + rt.rt_flags = RTF_UP | RTF_GATEWAY; + init_sockaddr_in((struct sockaddr_in *)&(rt.rt_genmask), "0.0.0.0"); + if(isdigit(argv[0][0])) { + init_sockaddr_in((struct sockaddr_in *)&(rt.rt_gateway), argv[0]); + } else { + die("expecting an IP address for parameter \"gw\"\n"); + } + EXPECT_NEXT(argc, argv); + if (!strcmp(argv[0], "dev")) { + EXPECT_NEXT(argc, argv); + rt.rt_dev = argv[0]; + if (ioctl(s, SIOCADDRT, &rt) < 0) { die("SIOCADDRT\n"); - } } + } + } + } else { + char keywords[3][10] = { "-net", "netmask", "gw" }; + struct sockaddr_in *paddr[3] = { &rt.rt_dst, &rt.rt_genmask, &rt.rt_gateway }; + int k = 0; + + memset((char *) &rt, 0, sizeof(struct rtentry)); + rt.rt_flags = RTF_UP | RTF_GATEWAY; + do { + if (!strcmp(argv[0], keywords[k])) { + EXPECT_NEXT(argc, argv); + if (isdigit(argv[0][0])) { + init_sockaddr_in(paddr[k], argv[0]); + } else { + die("expecting an IP/MASK address for parameter %s\n", keywords[k]); + } + if (k < 2) + EXPECT_NEXT(argc, argv); + } else { + die("expecting keyword(s)\n"); + } + } while (++k < 3); + + if (ioctl(s, SIOCADDRT, &rt) < 0) { + die("SIOCADDRT\n"); + } + } } - ADVANCE(argc, argv); + ADVANCE(argc, argv); } return 0; |
