]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Add loads more DHCP options from RFC2132 to the info file, also closes #53.
authorRoy Marples <roy@marples.name>
Mon, 14 Apr 2008 10:02:44 +0000 (10:02 +0000)
committerRoy Marples <roy@marples.name>
Mon, 14 Apr 2008 10:02:44 +0000 (10:02 +0000)
configure.c
dhcp.c
dhcp.h

index eca2a27c609af1078dd9de216a1d9734c8c7cc60..e491089a3140ccc046083d6af0495e7d25fa51a2 100644 (file)
@@ -371,50 +371,42 @@ write_info(const struct interface *iface, const struct dhcp_message *dhcp,
        }
 
        if (dhcp->yiaddr) {
-               fprintf(f, "IPADDR=%s\n", inet_ntoa(iface->addr));
-               fprintf(f, "NETMASK=%s\n", inet_ntoa(iface->net));
+               fprintf(f, "IPADDR='%s'\n", inet_ntoa(iface->addr));
+               fprintf(f, "NETMASK='%s'\n", inet_ntoa(iface->net));
                addr.s_addr = dhcp->yiaddr & iface->net.s_addr;
-               fprintf(f, "NETWORK=%s\n", inet_ntoa(addr));
+               fprintf(f, "NETWORK='%s'\n", inet_ntoa(addr));
                if (get_option_addr(&addr.s_addr, dhcp, DHCP_BROADCAST) == -1)
                        addr.s_addr = dhcp->yiaddr | ~iface->net.s_addr;
-               fprintf(f, "BROADCAST=%s\n", inet_ntoa(addr));
+               fprintf(f, "BROADCAST='%s'\n", inet_ntoa(addr));
 
                ort = get_option_routes(dhcp);
                doneone = 0;
-               fprintf(f, "ROUTES=");
+               fprintf(f, "ROUTES='");
                for (rt = ort; rt; rt = rt->next) {
                        if (rt->dest.s_addr == 0)
                                continue;
                        if (doneone)
                                fputc(' ', f);
-                       else {
-                               fputc('\'', f);
+                       else
                                doneone = 1;
-                       }
                        fprintf(f, "%s", inet_ntoa(rt->dest));
                        fprintf(f, ",%s", inet_ntoa(rt->net));
                        fprintf(f, ",%s", inet_ntoa(rt->gate));
                }
-               if (doneone)
-                       fputc('\'', f);
-               fputc('\n', f);
+               fprintf(f, "'\n");
 
                doneone = 0;
-               fprintf(f, "GATEWAYS=");
+               fprintf(f, "GATEWAYS='");
                for (rt = ort; rt; rt = rt->next) {
                        if (rt->dest.s_addr != 0)
                                continue;
                        if (doneone)
                                fputc(' ', f);
-                       else {
-                               fputc('\'', f);
+                       else
                                doneone = 1;
-                       }
                        fprintf(f, "%s", inet_ntoa(rt->gate));
                }
-               if (doneone)
-                       fputc('\'', f);
-               fputc('\n', f);
+               fprintf(f, "'\n");
                free_routes(ort);
        }
 
@@ -437,18 +429,18 @@ write_info(const struct interface *iface, const struct dhcp_message *dhcp,
 
        if (!(options->options & DHCPCD_INFORM) && dhcp->yiaddr) {
                if (!(options->options & DHCPCD_TEST))
-                       fprintf(f, "LEASEDFROM=%u\n", lease->leasedfrom);
-               fprintf(f, "LEASETIME=%u\n", lease->leasetime);
-               fprintf(f, "RENEWALTIME=%u\n", lease->renewaltime);
-               fprintf(f, "REBINDTIME=%u\n", lease->rebindtime);
+                       fprintf(f, "LEASEDFROM='%u'\n", lease->leasedfrom);
+               fprintf(f, "LEASETIME='%u'\n", lease->leasetime);
+               fprintf(f, "RENEWALTIME='%u'\n", lease->renewaltime);
+               fprintf(f, "REBINDTIME='%u'\n", lease->rebindtime);
        }
        print_clean(f, "INTERFACE", iface->name);
        print_clean(f, "CLASSID", options->classid);
        if (iface->clientid_len > 0) {
-               fprintf(f, "CLIENTID=%s\n",
+               fprintf(f, "CLIENTID='%s'\n",
                        hwaddr_ntoa(iface->clientid, iface->clientid_len));
        }
-       fprintf(f, "DHCPCHADDR=%s\n",
+       fprintf(f, "DHCPCHADDR='%s'\n",
                hwaddr_ntoa(iface->hwaddr, iface->hwlen));
 
        if (!(options->options & DHCPCD_TEST))
diff --git a/dhcp.c b/dhcp.c
index a352fc1d00aba2b85691f608ea03cce3fe17c12d..aadadda0fd48c954786b2159f8ec27fd70cf3894 100644 (file)
--- a/dhcp.c
+++ b/dhcp.c
 #include "dhcp.h"
 
 #define OPT_REQUEST    (1 << 0)
-#define OPT_UINT8      (1 << 3)
-#define OPT_UINT16     (1 << 4)
-#define OPT_UINT32     (1 << 5)
-#define OPT_IPV4       (1 << 6)
-#define OPT_STRING     (1 << 7)
-#define OPT_RFC3361    (1 << 10)
-#define OPT_RFC3397    (1 << 11)
+#define OPT_UINT8      (1 << 1)
+#define OPT_UINT16     (1 << 2)
+#define OPT_UINT32     (1 << 3)
+#define OPT_IPV4       (1 << 4)
+#define OPT_STRING     (1 << 5)
+#define OPT_ARRAY      (1 << 6) /* Not impletmented yet! */
+#define OPT_RFC3361    (1 << 7)
+#define OPT_RFC3397    (1 << 8)
 
 #define OPT_IPV4R      OPT_IPV4 | OPT_REQUEST
-#define OPT_UINT32R    OPT_UINT32 | OPT_REQUEST
-#define OPT_UINT16R    OPT_UINT16 | OPT_REQUEST
-#define OPT_STRINGR    OPT_STRING | OPT_REQUEST
 
 struct dhcp_option {
        uint8_t option;
@@ -56,25 +54,80 @@ struct dhcp_option {
 };
 
 const struct dhcp_option dhcp_options[] = {
-       { DHCP_SERVERID,        OPT_IPV4,       "SERVERID" },
        { DHCP_NETMASK,         OPT_IPV4R,      NULL },
-       { DHCP_BROADCAST,       OPT_IPV4R,      NULL },
-       { DHCP_LEASETIME,       OPT_UINT32,     NULL },
-       { DHCP_RENEWALTIME,     OPT_UINT32R,    NULL },
-       { DHCP_REBINDTIME,      OPT_UINT32R,    NULL },
-       { DHCP_MTU,             OPT_UINT16R,    "MTU" },
-       { DHCP_STATICROUTE,     OPT_IPV4R,      NULL },
+       { DHCP_TIMEOFFSET,      OPT_UINT32,     "TIMEOFFSET" },
        { DHCP_ROUTER,          OPT_IPV4R,      NULL },
-       { DHCP_HOSTNAME,        OPT_STRING,     "HOSTNAME" },
+       { DHCP_TIMESERVER,      OPT_IPV4,       "TIMESERVER" },
+       { DHCP_NAMESERVER,      OPT_IPV4,       "NAMESERVER" },
        { DHCP_DNSSERVER,       OPT_IPV4,       "DNSSERVER" },
+       { DHCP_LOGSERVER,       OPT_IPV4,       "LOGSERVER" },
+       { DHCP_COOKIESERVER,    OPT_IPV4,       "COOKIESERVER" },
+       { DHCP_LPRSERVER,       OPT_IPV4,       "LPRSERVER" },
+       { DHCP_IMPRESSSERVER,   OPT_IPV4,       "IMPRESSSERVER" },
+       { DHCP_RESOURCELOCATIONSERVER,  OPT_IPV4,       "RESOURCELOCATIONSERVER" },
+       { DHCP_HOSTNAME,        OPT_STRING,     "HOSTNAME" },
+       { DHCP_BOOTFILESIZE,    OPT_UINT16,     "BOOTFILESIZE" },
+       { DHCP_MERITDUMPFILE,   OPT_STRING,     "MERITDUMPFILE" },
        { DHCP_DNSDOMAIN,       OPT_STRING,     "DNSDOMAIN" },
-       { DHCP_DNSSEARCH,       OPT_STRING | OPT_RFC3397,       "DNSSEARCH" },
-       { DHCP_NTPSERVER,       OPT_IPV4,       "NTPSERVER" },
-       { DHCP_NISSERVER,       OPT_IPV4,       "NISSERVER" },
-       { DHCP_NISDOMAIN,       OPT_IPV4,       "NISDOMAIN" },
+       { DHCP_SWAPSERVER,      OPT_IPV4,       "SWAPSERVER" },
        { DHCP_ROOTPATH,        OPT_STRING,     "ROOTPATH" },
-       { DHCP_SIPSERVER,       OPT_STRING | OPT_RFC3361,       "SIPSERVER" },
+       { DHCP_EXTENSIONSPATH,  OPT_STRING,     "EXTENSIONSPATH" },
+
+       { DHCP_IPFORWARDING,    OPT_UINT8,      "IPFORWARDING" },
+       { DHCP_NONLOCALSOURCEROUTING,   OPT_UINT8,      "NONLOCALSOURCEROUTING" },
+       { DHCP_POLICYFILTER,    OPT_IPV4,       "POLICYFILTER" },
+       { DHCP_MAXDGRAMSIZE,    OPT_UINT16,     "MAXDGRAMSIZE" },
+       { DHCP_DEFAULTIPTTL,    OPT_UINT16,     "DEFAULTIPTTL" },
+       { DHCP_PATHMTUAGINGTIMEOUT, OPT_UINT32, "PATHMTUAGINGTIMEOUT" },
+       { DHCP_PATHMTUPLATEAUTABLE, OPT_UINT16 | OPT_ARRAY, "PATHMTUPLATEAUTABLE" },
+
+       { DHCP_MTU,             OPT_UINT16,     "MTU" },
+       { DHCP_ALLSUBNETSLOCAL, OPT_UINT8,      "ALLSUBNETSLOCAL" },
+       { DHCP_BROADCAST,       OPT_IPV4R,      NULL },
+       { DHCP_MASKDISCOVERY,   OPT_UINT8,      "MASKDISCOVERY" },
+       { DHCP_MASKSUPPLIER,    OPT_UINT8,      "MASKSUPPLIER" },
+       { DHCP_ROUTERDISCOVERY, OPT_UINT8,      "ROUTERDISCOVERY" },
+       { DHCP_ROUTERSOLICITATIONADDR, OPT_UINT8,       "ROUTERSOLICITATIONADDR" },
+       { DHCP_STATICROUTE,     OPT_IPV4R,      NULL },
+
+       { DHCP_TRAILERENCAPSULATION, OPT_UINT8, "TRAILERENCAPSULATION" },
+       { DHCP_ARPCACHETIMEOUT, OPT_UINT32,     "ARPCACHETIMEOUT" },
+       { DHCP_ETHERNETENCAPSULATION, OPT_UINT8,        "ETHERNETENCAPSULATION" },
+
+       { DHCP_TCPDEFAULTTTL,   OPT_UINT8,      "TCPDEFAULTTTL" },
+       { DHCP_TCPKEEPALIVEINTERVAL,    OPT_UINT32,     "TCPKEEPALIVEINTERVAL" },
+       { DHCP_TCPKEEPALIVEGARBAGE,     OPT_UINT8,      "TCPKEEPALIVEGARBAGE" },
+
+       { DHCP_NISDOMAIN,       OPT_IPV4,       "NISDOMAIN" },
+       { DHCP_NISSERVER,       OPT_IPV4,       "NISSERVER" },
+       { DHCP_NTPSERVER,       OPT_IPV4,       "NTPSERVER" },
+       { DHCP_VENDORSPECIFICINFO, 0,                   "VENDORSPECIFICINFO" },
+       { DHCP_NETBIOSNAMESERVER,       OPT_IPV4,       "NETBIOSNAMESERVER" },
+       { DHCP_NETBIOSDGRAMSERVER,      OPT_IPV4,       "NETBIOSDGRAMSERVER" },
+       { DHCP_NETBIOSNODETYPE, OPT_UINT8,              "NETBIOSNODETYPE" },
+       { DHCP_NETBIOSSCOPE,    0,                      "NETBIOSSCOPE" },
+       { DHCP_XFONTSERVER,     OPT_IPV4,               "XFONTSERVER" },
+       { DHCP_XDISPLAYMANAGER, OPT_IPV4,               "XDISPLAYMANAGER" },
+       { DHCP_NISPLUSDOMAIN,   OPT_IPV4,               "NISPLUSDOMAIN" },
+       { DHCP_NISPLUSSERVER,   OPT_IPV4,               "NISPLUSSERVER" },
+       { DHCP_MOBILEIPHOMEAGENT,       OPT_IPV4,       "MOBILEIPHOMEAGENT" },
+       { DHCP_SMTPSERVER,      OPT_IPV4,               "SMTPSERVER" },
+       { DHCP_POP3SERVER,      OPT_IPV4,               "POP3SERVER" },
+       { DHCP_NNTPSERVER,      OPT_IPV4,               "NNTPSERVER" },
+       { DHCP_WWWSERVER,       OPT_IPV4,               "WWWSERVER" },
+       { DHCP_FINGERSERVER,    OPT_IPV4,               "FINGERSERVER" },
+       { DHCP_IRCSERVER,       OPT_IPV4,               "IRCSERVER" },
+       { DHCP_STREETTALKSERVER,        OPT_IPV4,       "STREETTALKSERVER" },
+       { DHCP_STREETTALKDASERVER,      OPT_IPV4,       "STREETTALKDASERVER" },
+
+       { DHCP_LEASETIME,       OPT_UINT32,     NULL },
+       { DHCP_SERVERID,        OPT_IPV4,       "SERVERID" },
+       { DHCP_RENEWALTIME,     OPT_UINT32 | OPT_REQUEST,       NULL },
+       { DHCP_REBINDTIME,      OPT_UINT32 | OPT_REQUEST,       NULL },
+
        { DHCP_MESSAGE,         OPT_STRING,     NULL},
+       { DHCP_DNSSEARCH,       OPT_STRING | OPT_RFC3397,       "DNSSEARCH" },
+       { DHCP_SIPSERVER,       OPT_STRING | OPT_RFC3361,       "SIPSERVER" },
        { 0, 0, NULL }
 };
 
@@ -821,16 +874,16 @@ write_options(FILE *f, const struct dhcp_message *dhcp)
        ssize_t retval = 0;
 
        for (i = 0; i < sizeof(dhcp_options) / sizeof(dhcp_options[0]); i++) {
-               if (!dhcp_options[i].var)
+               if (!dhcp_options[i].var || !dhcp_options[i].type)
                        continue;
 
-               retval += fprintf(f, "%s=", dhcp_options[i].var);
+               retval += fprintf(f, "%s='", dhcp_options[i].var);
 
                if (dhcp_options[i].type & OPT_STRING) {
                        s = get_option_string(dhcp, dhcp_options[i].type);
                        if (s) {
                                c = clean_metas(s);
-                               retval += fprintf(f, "'%s'", c);
+                               retval += fprintf(f, "%s", c);
                                free(c);
                                free(s);
                        } 
@@ -851,8 +904,6 @@ write_options(FILE *f, const struct dhcp_message *dhcp)
                if (dhcp_options[i].type & OPT_IPV4) {
                        p = get_option(dhcp, dhcp_options[i].option);
                        if (p) {
-                               if (fputc('\'', f))
-                                       retval++;
                                u8 = *p++;
                                t = p;
                                e = p + u8;
@@ -865,13 +916,9 @@ write_options(FILE *f, const struct dhcp_message *dhcp)
                                                        inet_ntoa(addr));
                                        p += sizeof(addr.s_addr);
                                }
-                               if (fputc('\'', f))
-                                       retval++;
                        }
                }
-       
-               if (fputc('\n', f))
-                       retval++;       
+               retval += fprintf(f, "'\n");
        }
        return retval;
 }
diff --git a/dhcp.h b/dhcp.h
index 3b24d12375bcc39686ddc2bf8909e65ca0360cdd..3031ff5d89222eac1160f57405466e8c9c351b24 100644 (file)
--- a/dhcp.h
+++ b/dhcp.h
@@ -66,7 +66,7 @@ enum DHCP_OPTIONS
 {
        DHCP_PAD                    = 0,
        DHCP_NETMASK                = 1,
-       DHCP_TIMEROFFSET            = 2,
+       DHCP_TIMEOFFSET             = 2,
        DHCP_ROUTER                 = 3,
        DHCP_TIMESERVER             = 4,
        DHCP_NAMESERVER             = 5,
@@ -75,18 +75,18 @@ enum DHCP_OPTIONS
        DHCP_COOKIESERVER           = 8,
        DHCP_LPRSERVER              = 9,
        DHCP_IMPRESSSERVER          = 10,
-       DHCP_RLSSERVER              = 11,
+       DHCP_RESOURCELOCATIONSERVER = 11,
        DHCP_HOSTNAME               = 12,
        DHCP_BOOTFILESIZE           = 13,
        DHCP_MERITDUMPFILE          = 14,
        DHCP_DNSDOMAIN              = 15,
        DHCP_SWAPSERVER             = 16,
        DHCP_ROOTPATH               = 17,
-       DHCP_EXTENTIONSPATH         = 18,
+       DHCP_EXTENSIONSPATH         = 18,
        DHCP_IPFORWARDING           = 19,
        DHCP_NONLOCALSOURCEROUTING  = 20,
        DHCP_POLICYFILTER           = 21,
-       DHCP_MAXDGRAMREASMSIZE      = 22,
+       DHCP_MAXDGRAMSIZE           = 22,
        DHCP_DEFAULTIPTTL           = 23,
        DHCP_PATHMTUAGINGTIMEOUT    = 24,
        DHCP_PATHMTUPLATEAUTABLE    = 25,
@@ -109,7 +109,7 @@ enum DHCP_OPTIONS
        DHCP_NTPSERVER              = 42,
        DHCP_VENDORSPECIFICINFO     = 43,
        DHCP_NETBIOSNAMESERVER      = 44,
-       DHCP_NETBIOSDDSERVER        = 45,
+       DHCP_NETBIOSDGRAMSERVER     = 45,
        DHCP_NETBIOSNODETYPE        = 46,
        DHCP_NETBIOSSCOPE           = 47,
        DHCP_XFONTSERVER            = 48,
@@ -126,6 +126,17 @@ enum DHCP_OPTIONS
        DHCP_REBINDTIME             = 59,
        DHCP_CLASSID                = 60,
        DHCP_CLIENTID               = 61,
+       DHCP_NISPLUSDOMAIN          = 64,
+       DHCP_NISPLUSSERVER          = 65,
+       DHCP_MOBILEIPHOMEAGENT      = 68,
+       DHCP_SMTPSERVER             = 69,
+       DHCP_POP3SERVER             = 70,
+       DHCP_NNTPSERVER             = 71,
+       DHCP_WWWSERVER              = 72,
+       DHCP_FINGERSERVER           = 73,
+       DHCP_IRCSERVER              = 74,
+       DHCP_STREETTALKSERVER       = 75,
+       DHCP_STREETTALKDASERVER     = 76,
        DHCP_USERCLASS              = 77,  /* RFC 3004 */
        DHCP_FQDN                   = 81,
        DHCP_DNSSEARCH              = 119, /* RFC 3397 */