aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--networking/libiproute/iplink.c93
1 files changed, 39 insertions, 54 deletions
diff --git a/networking/libiproute/iplink.c b/networking/libiproute/iplink.c
index a28df6e79..583a2801c 100644
--- a/networking/libiproute/iplink.c
+++ b/networking/libiproute/iplink.c
@@ -186,56 +186,48 @@ static int do_set(char **argv)
186 if (key == ARG_up) { 186 if (key == ARG_up) {
187 mask |= IFF_UP; 187 mask |= IFF_UP;
188 flags |= IFF_UP; 188 flags |= IFF_UP;
189 } 189 } else if (key == ARG_down) {
190 if (key == ARG_down) {
191 mask |= IFF_UP; 190 mask |= IFF_UP;
192 flags &= ~IFF_UP; 191 flags &= ~IFF_UP;
193 } 192 } else if (key == ARG_name) {
194 if (key == ARG_name) {
195 NEXT_ARG(); 193 NEXT_ARG();
196 newname = *argv; 194 newname = *argv;
197 } 195 } else if (key == ARG_mtu) {
198 if (key == ARG_mtu) {
199 NEXT_ARG(); 196 NEXT_ARG();
200 if (mtu != -1) 197 if (mtu != -1)
201 duparg("mtu", *argv); 198 duparg("mtu", *argv);
202 mtu = get_unsigned(*argv, "mtu"); 199 mtu = get_unsigned(*argv, "mtu");
203 } 200 } else if (key == ARG_addr) {
204 if (key == ARG_multicast) {
205 int param;
206 NEXT_ARG();
207 mask |= IFF_MULTICAST;
208 param = index_in_strings(str_on_off, *argv);
209 if (param < 0)
210 die_must_be_on_off("multicast");
211 if (param == PARM_on)
212 flags |= IFF_MULTICAST;
213 else
214 flags &= ~IFF_MULTICAST;
215 }
216 if (key == ARG_arp) {
217 int param;
218 NEXT_ARG();
219 mask |= IFF_NOARP;
220 param = index_in_strings(str_on_off, *argv);
221 if (param < 0)
222 die_must_be_on_off("arp");
223 if (param == PARM_on)
224 flags &= ~IFF_NOARP;
225 else
226 flags |= IFF_NOARP;
227 }
228 if (key == ARG_addr) {
229 NEXT_ARG(); 201 NEXT_ARG();
230 newaddr = *argv; 202 newaddr = *argv;
231 } 203 } else if (key >= ARG_dev) {
232 if (key >= ARG_dev) {
233 if (key == ARG_dev) { 204 if (key == ARG_dev) {
234 NEXT_ARG(); 205 NEXT_ARG();
235 } 206 }
236 if (dev) 207 if (dev)
237 duparg2("dev", *argv); 208 duparg2("dev", *argv);
238 dev = *argv; 209 dev = *argv;
210 } else {
211 int param;
212 NEXT_ARG();
213 param = index_in_strings(str_on_off, *argv);
214 if (key == ARG_multicast) {
215 if (param < 0)
216 die_must_be_on_off("multicast");
217 mask |= IFF_MULTICAST;
218 if (param == PARM_on)
219 flags |= IFF_MULTICAST;
220 else
221 flags &= ~IFF_MULTICAST;
222 } else if (key == ARG_arp) {
223 if (param < 0)
224 die_must_be_on_off("arp");
225 mask |= IFF_NOARP;
226 if (param == PARM_on)
227 flags &= ~IFF_NOARP;
228 else
229 flags |= IFF_NOARP;
230 }
239 } 231 }
240 argv++; 232 argv++;
241 } 233 }
@@ -248,9 +240,11 @@ static int do_set(char **argv)
248 halen = get_address(dev, &htype); 240 halen = get_address(dev, &htype);
249 if (newaddr) { 241 if (newaddr) {
250 parse_address(dev, htype, halen, newaddr, &ifr0); 242 parse_address(dev, htype, halen, newaddr, &ifr0);
243 set_address(&ifr0, 0);
251 } 244 }
252 if (newbrd) { 245 if (newbrd) {
253 parse_address(dev, htype, halen, newbrd, &ifr1); 246 parse_address(dev, htype, halen, newbrd, &ifr1);
247 set_address(&ifr1, 1);
254 } 248 }
255 } 249 }
256 250
@@ -264,14 +258,6 @@ static int do_set(char **argv)
264 if (mtu != -1) { 258 if (mtu != -1) {
265 set_mtu(dev, mtu); 259 set_mtu(dev, mtu);
266 } 260 }
267 if (newaddr || newbrd) {
268 if (newbrd) {
269 set_address(&ifr1, 1);
270 }
271 if (newaddr) {
272 set_address(&ifr0, 0);
273 }
274 }
275 if (mask) 261 if (mask)
276 do_chflags(dev, flags, mask); 262 do_chflags(dev, flags, mask);
277 return 0; 263 return 0;
@@ -304,7 +290,7 @@ static int do_change(char **argv, const unsigned rtm)
304 struct ifinfomsg i; 290 struct ifinfomsg i;
305 char buf[1024]; 291 char buf[1024];
306 } req; 292 } req;
307 int arg; 293 smalluint arg;
308 char *name_str = NULL, *link_str = NULL, *type_str = NULL, *dev_str = NULL; 294 char *name_str = NULL, *link_str = NULL, *type_str = NULL, *dev_str = NULL;
309 295
310 memset(&req, 0, sizeof(req)); 296 memset(&req, 0, sizeof(req));
@@ -375,17 +361,16 @@ int do_iplink(char **argv)
375{ 361{
376 static const char keywords[] ALIGN1 = 362 static const char keywords[] ALIGN1 =
377 "add\0""delete\0""set\0""show\0""lst\0""list\0"; 363 "add\0""delete\0""set\0""show\0""lst\0""list\0";
378 int key; 364 if (*argv) {
379 if (!*argv) 365 smalluint key = index_in_substrings(keywords, *argv);
380 return ipaddr_list_link(argv); 366 if (key > 5) /* invalid argument */
381 key = index_in_substrings(keywords, *argv); 367 bb_error_msg_and_die(bb_msg_invalid_arg, *argv, applet_name);
382 if (key < 0) 368 argv++;
383 bb_error_msg_and_die(bb_msg_invalid_arg, *argv, applet_name); 369 if (key <= 1) /* add/delete */
384 argv++; 370 return do_change(argv, key ? RTM_DELLINK : RTM_NEWLINK);
385 if (key <= 1) /* add/delete */ 371 else if (key == 2) /* set */
386 return do_change(argv, key ? RTM_DELLINK : RTM_NEWLINK); 372 return do_set(argv);
387 else if (key == 2) /* set */ 373 }
388 return do_set(argv);
389 /* show, lst, list */ 374 /* show, lst, list */
390 return ipaddr_list_link(argv); 375 return ipaddr_list_link(argv);
391} 376}