RFC 4242 support.

This commit is contained in:
Simon Kelley
2012-07-18 16:21:11 +01:00
parent b271446f82
commit 23245c0cb2
5 changed files with 49 additions and 9 deletions

View File

@@ -487,15 +487,15 @@ static const struct opttab_t {
{ "x-windows-fs", 48, OT_ADDR_LIST },
{ "x-windows-dm", 49, OT_ADDR_LIST },
{ "requested-address", 50, OT_INTERNAL | OT_ADDR_LIST },
{ "lease-time", 51, OT_INTERNAL | OT_DEC },
{ "lease-time", 51, OT_INTERNAL | OT_TIME },
{ "option-overload", 52, OT_INTERNAL },
{ "message-type", 53, OT_INTERNAL | OT_DEC },
{ "server-identifier", 54, OT_INTERNAL | OT_ADDR_LIST },
{ "parameter-request", 55, OT_INTERNAL },
{ "message", 56, OT_INTERNAL },
{ "max-message-size", 57, OT_INTERNAL },
{ "T1", 58, OT_INTERNAL | OT_DEC},
{ "T2", 59, OT_INTERNAL | OT_DEC},
{ "T1", 58, OT_INTERNAL | OT_TIME},
{ "T2", 59, OT_INTERNAL | OT_TIME},
{ "vendor-class", 60, 0 },
{ "client-id", 61, OT_INTERNAL },
{ "nis+-domain", 64, OT_NAME },
@@ -546,6 +546,7 @@ static const struct opttab_t opttab6[] = {
{ "nis-domain", 29, OT_RFC1035_NAME },
{ "nis+-domain", 30, OT_RFC1035_NAME },
{ "sntp-server", 31, OT_ADDR_LIST },
{ "information-refresh-time", 32, OT_TIME },
{ "FQDN", 39, OT_INTERNAL | OT_RFC1035_NAME },
{ "ntp-server", 56, OT_ADDR_LIST },
{ "bootfile-url", 59, OT_NAME },
@@ -710,14 +711,17 @@ char *option_string(int prot, unsigned int opt, unsigned char *val, int opt_len,
}
}
#endif
else if ((ot[o].size & OT_DEC) && opt_len != 0)
else if ((ot[o].size & (OT_DEC | OT_TIME)) && opt_len != 0)
{
unsigned int dec = 0;
for (i = 0; i < opt_len; i++)
dec = (dec << 8) | val[i];
sprintf(buf, "%u", dec);
if (ot[o].size & OT_TIME)
prettyprint_time(buf, dec);
else
sprintf(buf, "%u", dec);
}
else
nodecode = 1;

View File

@@ -475,7 +475,7 @@ struct frec {
#define OT_NAME 0x1000
#define OT_CSTRING 0x0800
#define OT_DEC 0x0400
#define OT_TIME 0x0200
/* actions in the daemon->helper RPC */
#define ACTION_DEL 1

View File

@@ -764,7 +764,7 @@ static int parse_dhcp_opt(char *errstr, char *arg, int flags)
}
else if (c == '.')
{
is_addr6 =is_dec = is_hex = 0;
is_addr6 = is_dec = is_hex = 0;
dots++;
}
else if (c == '-')
@@ -811,8 +811,36 @@ static int parse_dhcp_opt(char *errstr, char *arg, int flags)
/* or names */
else if (opt_len & (OT_NAME | OT_RFC1035_NAME | OT_CSTRING))
is_addr6 = is_addr = is_dec = is_hex = 0;
if (is_hex && digs > 1)
if (found_dig && (opt_len & OT_TIME) && strlen(comma) > 0)
{
int val, fac = 1;
switch (comma[strlen(comma) - 1])
{
case 'd':
case 'D':
fac *= 24;
/* fall though */
case 'h':
case 'H':
fac *= 60;
/* fall through */
case 'm':
case 'M':
fac *= 60;
/* fall through */
case 's':
case 'S':
comma[strlen(comma) - 1] = 0;
}
new->len = 4;
new->val = opt_malloc(4);
val = atoi(comma);
*((int *)new->val) = htonl(val * fac);
}
else if (is_hex && digs > 1)
{
new->len = digs;
new->val = opt_malloc(new->len);