aboutsummaryrefslogtreecommitdiff
path: root/networking/udhcp/dhcpc.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2011-10-20 14:24:18 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2011-10-20 14:24:18 +0200
commitfbca0c68a75d0f2243bd7995d130e9cb8f6d2e18 (patch)
tree74c5f26b77d346d6975f0cc1f51762a74e688031 /networking/udhcp/dhcpc.c
parentcd4d78f525526df0d2b62dce5a0dfc510debd6de (diff)
downloadbusybox-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.c54
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