diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2011-10-20 14:24:18 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2011-10-20 14:24:18 +0200 |
commit | fbca0c68a75d0f2243bd7995d130e9cb8f6d2e18 (patch) | |
tree | 74c5f26b77d346d6975f0cc1f51762a74e688031 /networking/udhcp/dhcpc.c | |
parent | cd4d78f525526df0d2b62dce5a0dfc510debd6de (diff) | |
download | busybox-w32-fbca0c68a75d0f2243bd7995d130e9cb8f6d2e18.tar.gz busybox-w32-fbca0c68a75d0f2243bd7995d130e9cb8f6d2e18.tar.bz2 busybox-w32-fbca0c68a75d0f2243bd7995d130e9cb8f6d2e18.zip |
udhcpc: in fill_envp, export BOOTP fields first
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'networking/udhcp/dhcpc.c')
-rw-r--r-- | networking/udhcp/dhcpc.c | 54 |
1 files changed, 36 insertions, 18 deletions
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c index d67769e65..36c8a3dd3 100644 --- a/networking/udhcp/dhcpc.c +++ b/networking/udhcp/dhcpc.c | |||
@@ -393,7 +393,7 @@ static char **fill_envp(struct dhcp_packet *packet) | |||
393 | if (i == DHCP_OPTION_OVERLOAD) | 393 | if (i == DHCP_OPTION_OVERLOAD) |
394 | overload = *temp; | 394 | overload = *temp; |
395 | else if (i == DHCP_SUBNET) | 395 | else if (i == DHCP_SUBNET) |
396 | envc++; /* for mton */ | 396 | envc++; /* for $mask */ |
397 | envc++; | 397 | envc++; |
398 | /*if (i != DHCP_MESSAGE_TYPE)*/ | 398 | /*if (i != DHCP_MESSAGE_TYPE)*/ |
399 | FOUND_OPTS(i) |= BMASK(i); | 399 | FOUND_OPTS(i) |= BMASK(i); |
@@ -408,10 +408,42 @@ static char **fill_envp(struct dhcp_packet *packet) | |||
408 | if (!packet) | 408 | if (!packet) |
409 | return envp; | 409 | return envp; |
410 | 410 | ||
411 | /* Export BOOTP fields. Fields we don't (yet?) export: | ||
412 | * uint8_t op; // always BOOTREPLY | ||
413 | * uint8_t htype; // hardware address type. 1 = 10mb ethernet | ||
414 | * uint8_t hlen; // hardware address length | ||
415 | * uint8_t hops; // used by relay agents only | ||
416 | * uint32_t xid; | ||
417 | * uint16_t secs; // elapsed since client began acquisition/renewal | ||
418 | * uint16_t flags; // only one flag so far: bcast. Never set by server | ||
419 | * uint32_t ciaddr; // client IP (usually == yiaddr. can it be different | ||
420 | * // if during renew server wants to give us differn IP?) | ||
421 | * uint32_t gateway_nip; // relay agent IP address | ||
422 | * uint8_t chaddr[16]; // link-layer client hardware address (MAC) | ||
423 | * TODO: export gateway_nip as $giaddr? | ||
424 | */ | ||
425 | /* Most important one: yiaddr as $ip */ | ||
411 | *curr = xmalloc(sizeof("ip=255.255.255.255")); | 426 | *curr = xmalloc(sizeof("ip=255.255.255.255")); |
412 | sprint_nip(*curr, "ip=", (uint8_t *) &packet->yiaddr); | 427 | sprint_nip(*curr, "ip=", (uint8_t *) &packet->yiaddr); |
413 | putenv(*curr++); | 428 | putenv(*curr++); |
429 | if (packet->siaddr_nip) { | ||
430 | /* IP address of next server to use in bootstrap */ | ||
431 | *curr = xmalloc(sizeof("siaddr=255.255.255.255")); | ||
432 | sprint_nip(*curr, "siaddr=", (uint8_t *) &packet->siaddr_nip); | ||
433 | putenv(*curr++); | ||
434 | } | ||
435 | if (!(overload & FILE_FIELD) && packet->file[0]) { | ||
436 | /* watch out for invalid packets */ | ||
437 | *curr = xasprintf("boot_file=%."DHCP_PKT_FILE_LEN_STR"s", packet->file); | ||
438 | putenv(*curr++); | ||
439 | } | ||
440 | if (!(overload & SNAME_FIELD) && packet->sname[0]) { | ||
441 | /* watch out for invalid packets */ | ||
442 | *curr = xasprintf("sname=%."DHCP_PKT_SNAME_LEN_STR"s", packet->sname); | ||
443 | putenv(*curr++); | ||
444 | } | ||
414 | 445 | ||
446 | /* Export known DHCP options */ | ||
415 | opt_name = dhcp_option_strings; | 447 | opt_name = dhcp_option_strings; |
416 | i = 0; | 448 | i = 0; |
417 | while (*opt_name) { | 449 | while (*opt_name) { |
@@ -428,29 +460,14 @@ static char **fill_envp(struct dhcp_packet *packet) | |||
428 | /* Subnet option: make things like "$ip/$mask" possible */ | 460 | /* Subnet option: make things like "$ip/$mask" possible */ |
429 | uint32_t subnet; | 461 | uint32_t subnet; |
430 | move_from_unaligned32(subnet, temp); | 462 | move_from_unaligned32(subnet, temp); |
431 | *curr = xasprintf("mask=%d", mton(subnet)); | 463 | *curr = xasprintf("mask=%u", mton(subnet)); |
432 | putenv(*curr++); | 464 | putenv(*curr++); |
433 | } | 465 | } |
434 | next: | 466 | next: |
435 | opt_name += strlen(opt_name) + 1; | 467 | opt_name += strlen(opt_name) + 1; |
436 | i++; | 468 | i++; |
437 | } | 469 | } |
438 | if (packet->siaddr_nip) { | 470 | /* Export unknown options */ |
439 | *curr = xmalloc(sizeof("siaddr=255.255.255.255")); | ||
440 | sprint_nip(*curr, "siaddr=", (uint8_t *) &packet->siaddr_nip); | ||
441 | putenv(*curr++); | ||
442 | } | ||
443 | if (!(overload & FILE_FIELD) && packet->file[0]) { | ||
444 | /* watch out for invalid packets */ | ||
445 | *curr = xasprintf("boot_file=%."DHCP_PKT_FILE_LEN_STR"s", packet->file); | ||
446 | putenv(*curr++); | ||
447 | } | ||
448 | if (!(overload & SNAME_FIELD) && packet->sname[0]) { | ||
449 | /* watch out for invalid packets */ | ||
450 | *curr = xasprintf("sname=%."DHCP_PKT_SNAME_LEN_STR"s", packet->sname); | ||
451 | putenv(*curr++); | ||
452 | } | ||
453 | /* Handle unknown options */ | ||
454 | for (i = 0; i < 256;) { | 471 | for (i = 0; i < 256;) { |
455 | BITMAP bitmap = FOUND_OPTS(i); | 472 | BITMAP bitmap = FOUND_OPTS(i); |
456 | if (!bitmap) { | 473 | if (!bitmap) { |
@@ -472,6 +489,7 @@ static char **fill_envp(struct dhcp_packet *packet) | |||
472 | } | 489 | } |
473 | i++; | 490 | i++; |
474 | } | 491 | } |
492 | |||
475 | return envp; | 493 | return envp; |
476 | } | 494 | } |
477 | 495 | ||