udhcpc: in fill_envp, export BOOTP fields first
No binary (build failed)
—
(log yok)
| @@ -393,7 +393,7 @@ static char **fill_envp(struct dhcp_packet *packet) | |
| if (i == DHCP_OPTION_OVERLOAD) | |
| overload = *temp; | |
| else if (i == DHCP_SUBNET) | |
| - | envc++; /* for mton */ |
| + | envc++; /* for $mask */ |
| envc++; | |
| /*if (i != DHCP_MESSAGE_TYPE)*/ | |
| FOUND_OPTS(i) |= BMASK(i); | |
| @@ -408,10 +408,42 @@ static char **fill_envp(struct dhcp_packet *packet) | |
| if (!packet) | |
| return envp; | |
| + | /* Export BOOTP fields. Fields we don't (yet?) export: |
| + | * uint8_t op; // always BOOTREPLY |
| + | * uint8_t htype; // hardware address type. 1 = 10mb ethernet |
| + | * uint8_t hlen; // hardware address length |
| + | * uint8_t hops; // used by relay agents only |
| + | * uint32_t xid; |
| + | * uint16_t secs; // elapsed since client began acquisition/renewal |
| + | * uint16_t flags; // only one flag so far: bcast. Never set by server |
| + | * uint32_t ciaddr; // client IP (usually == yiaddr. can it be different |
| + | * // if during renew server wants to give us differn IP?) |
| + | * uint32_t gateway_nip; // relay agent IP address |
| + | * uint8_t chaddr[16]; // link-layer client hardware address (MAC) |
| + | * TODO: export gateway_nip as $giaddr? |
| + | */ |
| + | /* Most important one: yiaddr as $ip */ |
| *curr = xmalloc(sizeof("ip=255.255.255.255")); | |
| sprint_nip(*curr, "ip=", (uint8_t *) &packet->yiaddr); | |
| putenv(*curr++); | |
| + | if (packet->siaddr_nip) { |
| + | /* IP address of next server to use in bootstrap */ |
| + | *curr = xmalloc(sizeof("siaddr=255.255.255.255")); |
| + | sprint_nip(*curr, "siaddr=", (uint8_t *) &packet->siaddr_nip); |
| + | putenv(*curr++); |
| + | } |
| + | if (!(overload & FILE_FIELD) && packet->file[0]) { |
| + | /* watch out for invalid packets */ |
| + | *curr = xasprintf("boot_file=%."DHCP_PKT_FILE_LEN_STR"s", packet->file); |
| + | putenv(*curr++); |
| + | } |
| + | if (!(overload & SNAME_FIELD) && packet->sname[0]) { |
| + | /* watch out for invalid packets */ |
| + | *curr = xasprintf("sname=%."DHCP_PKT_SNAME_LEN_STR"s", packet->sname); |
| + | putenv(*curr++); |
| + | } |
| + | /* Export known DHCP options */ |
| opt_name = dhcp_option_strings; | |
| i = 0; | |
| while (*opt_name) { | |
| @@ -428,29 +460,14 @@ static char **fill_envp(struct dhcp_packet *packet) | |
| /* Subnet option: make things like "$ip/$mask" possible */ | |
| uint32_t subnet; | |
| move_from_unaligned32(subnet, temp); | |
| - | *curr = xasprintf("mask=%d", mton(subnet)); |
| + | *curr = xasprintf("mask=%u", mton(subnet)); |
| putenv(*curr++); | |
| } | |
| next: | |
| opt_name += strlen(opt_name) + 1; | |
| i++; | |
| } | |
| - | if (packet->siaddr_nip) { |
| - | *curr = xmalloc(sizeof("siaddr=255.255.255.255")); |
| - | sprint_nip(*curr, "siaddr=", (uint8_t *) &packet->siaddr_nip); |
| - | putenv(*curr++); |
| - | } |
| - | if (!(overload & FILE_FIELD) && packet->file[0]) { |
| - | /* watch out for invalid packets */ |
| - | *curr = xasprintf("boot_file=%."DHCP_PKT_FILE_LEN_STR"s", packet->file); |
| - | putenv(*curr++); |
| - | } |
| - | if (!(overload & SNAME_FIELD) && packet->sname[0]) { |
| - | /* watch out for invalid packets */ |
| - | *curr = xasprintf("sname=%."DHCP_PKT_SNAME_LEN_STR"s", packet->sname); |
| - | putenv(*curr++); |
| - | } |
| - | /* Handle unknown options */ |
| + | /* Export unknown options */ |
| for (i = 0; i < 256;) { | |
| BITMAP bitmap = FOUND_OPTS(i); | |
| if (!bitmap) { | |
| @@ -472,6 +489,7 @@ static char **fill_envp(struct dhcp_packet *packet) | |
| } | |
| i++; | |
| } | |
| + | |
| return envp; | |
| } | |