Mirror of git://git.busybox.net/busybox with our patches on top
Source
xxxxxxxxxx
/* vi: set sw=4 ts=4: */
/* script.c
*
* Functions to call the DHCP client notification scripts
*
* Russ Dill <Russ.Dill@asu.edu> July 2001
*
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
*/
/* get a rough idea of how long an option will be (rounding up...) */
static const uint8_t max_option_length[] = {
[OPTION_IP] = sizeof("255.255.255.255 "),
[OPTION_IP_PAIR] = sizeof("255.255.255.255 ") * 2,
[OPTION_STRING] = 1,
[OPTION_STR1035] = 1,
[OPTION_BOOLEAN] = sizeof("yes "),
[OPTION_U8] = sizeof("255 "),
[OPTION_U16] = sizeof("65535 "),
[OPTION_S16] = sizeof("-32768 "),
[OPTION_U32] = sizeof("4294967295 "),
[OPTION_S32] = sizeof("-2147483684 "),
};
static inline int upper_length(int length, int opt_index)
{
return max_option_length[opt_index] *
(length / dhcp_option_lengths[opt_index]);
}
static int sprintip(char *dest, const char *pre, const uint8_t *ip)
{
return sprintf(dest, "%s%d.%d.%d.%d", pre, ip[0], ip[1], ip[2], ip[3]);
}
/* really simple implementation, just count the bits */
static int mton(uint32_t mask)
{
int i = 0;
mask = ntohl(mask); /* 111110000-like bit pattern */
while (mask) {
i++;
mask <<= 1;
}
return i;
}
/* Allocate and fill with the text of option 'option'. */
static char *alloc_fill_opts(uint8_t *option, const struct dhcp_option *type_p, const char *opt_name)
{
int len, type, optlen;
uint16_t val_u16;
int16_t val_s16;
uint32_t val_u32;
int32_t val_s32;
char *dest, *ret;
len = option[OPT_LEN - 2];
type = type_p->flags & TYPE_MASK;
optlen = dhcp_option_lengths[type];
dest = ret = xmalloc(upper_length(len, type) + strlen(opt_name) + 2);
dest += sprintf(ret, "%s=", opt_name);
for (;;) {
switch (type) {
case OPTION_IP_PAIR:
dest += sprintip(dest, "", option);
*dest++ = '/';
option += 4;
optlen = 4;
case OPTION_IP: /* Works regardless of host byte order. */
dest += sprintip(dest, "", option);
break;
case OPTION_BOOLEAN:
dest += sprintf(dest, *option ? "yes" : "no");
break;
case OPTION_U8:
dest += sprintf(dest, "%u", *option);
break;
case OPTION_U16: