diff -x CVS -urN dnsmasq-1.18/dhcp.c dnsmasq.old/dhcp.c
--- dnsmasq-1.18/dhcp.c	2003-11-05 08:30:20.000000000 -0600
+++ dnsmasq.old/dhcp.c	2004-01-05 23:40:11.000000000 -0600
@@ -15,14 +15,20 @@
 
 #include "dnsmasq.h"
 
-static int next_token (char *token, int buffsize, FILE * fp);
+struct dhcpOfferedAddr {
+        u_int8_t hostname[16];
+        u_int8_t chaddr[16];
+        u_int32_t yiaddr;       /* network order */
+        u_int32_t expires;      /* host order */
+};
 
 void load_dhcp(char *file, char *suffix, time_t now, char *hostname)
 {
-  char token[MAXTOK], *dot;
+  char *dot;
   struct all_addr host_address;
-  time_t ttd, tts;
+  time_t ttd;
   FILE *fp = fopen (file, "r");
+  struct dhcpOfferedAddr lease;
   
   if (!fp)
     {
@@ -34,154 +40,45 @@
 
   /* remove all existing DHCP cache entries */
   cache_unhash_dhcp();
-  
-  while ((next_token(token, MAXTOK, fp)))
-    {
-      if (strcmp(token, "lease") == 0)
-        {
-          hostname[0] = '\0';
-	  ttd = tts = (time_t)(-1);
-#ifdef HAVE_IPV6
-          if (next_token(token, MAXTOK, fp) && 
-	      inet_pton(AF_INET, token, &host_address))
-#else
-	  if (next_token(token, MAXTOK, fp) && 
-	      (host_address.addr4.s_addr = inet_addr(token)) != (in_addr_t) -1)
-#endif
-            {
-              if (next_token(token, MAXTOK, fp) && *token == '{')
-                {
-                  while (next_token(token, MAXTOK, fp) && *token != '}')
+
+  while (fread(&lease, sizeof(lease), 1, fp)) {  
+	  host_address.addr.addr4.s_addr = lease.yiaddr;
+
+	strcpy(hostname,lease.hostname);
+	if (lease.expires>(unsigned)now)
+	ttd = lease.expires;
+	else
+	ttd = -1;
+                  dot = strchr(hostname, '.');
+                  if (suffix)
                     {
-                      if ((strcmp(token, "client-hostname") == 0) ||
-			  (strcmp(token, "hostname") == 0))
-			{
-			  if (next_token(hostname, MAXDNAME, fp))
-			    if (!canonicalise(hostname))
-			      {
-				*hostname = 0;
-				syslog(LOG_ERR, "bad name in %s", file); 
-			      }
-			}
-                      else if ((strcmp(token, "ends") == 0) ||
-			       (strcmp(token, "starts") == 0))
-                        {
-                          struct tm lease_time;
-			  int is_ends = (strcmp(token, "ends") == 0);
-			  if (next_token(token, MAXTOK, fp) &&  /* skip weekday */
-			      next_token(token, MAXTOK, fp) &&  /* Get date from lease file */
-			      sscanf (token, "%d/%d/%d", 
-				      &lease_time.tm_year,
-				      &lease_time.tm_mon,
-				      &lease_time.tm_mday) == 3 &&
-			      next_token(token, MAXTOK, fp) &&
-			      sscanf (token, "%d:%d:%d:", 
-				      &lease_time.tm_hour,
-				      &lease_time.tm_min, 
-				      &lease_time.tm_sec) == 3)
-			    {
-			      /* There doesn't seem to be a universally available library function
-				 which converts broken-down _GMT_ time to seconds-in-epoch.
-				 The following was borrowed from ISC dhcpd sources, where
-                                 it is noted that it might not be entirely accurate for odd seconds.
-				 Since we're trying to get the same answer as dhcpd, that's just
-				 fine here. */
-			      static int months [11] = { 31, 59, 90, 120, 151, 181,
-							 212, 243, 273, 304, 334 };
-			      time_t time = ((((((365 * (lease_time.tm_year - 1970) + /* Days in years since '70 */
-						  (lease_time.tm_year - 1969) / 4 +   /* Leap days since '70 */
-						  (lease_time.tm_mon > 1                /* Days in months this year */
-						   ? months [lease_time.tm_mon - 2]
-						   : 0) +
-						  (lease_time.tm_mon > 2 &&         /* Leap day this year */
-						   !((lease_time.tm_year - 1972) & 3)) +
-						  lease_time.tm_mday - 1) * 24) +   /* Day of month */
-						lease_time.tm_hour) * 60) +
-					      lease_time.tm_min) * 60) + lease_time.tm_sec;
-			      if (is_ends)
-				ttd = time;
-			      else
-				tts = time;			    }
+                      if (dot)
+                        { /* suffix and lease has ending: must match */
+                          if (strcmp(dot+1, suffix) != 0)
+                            syslog(LOG_WARNING,
+                                   "Ignoring DHCP lease for %s because it has an illegal domain part", hostname);
+                          else
+                            cache_add_dhcp_entry(hostname, &host_address, ttd, F_REVERSE);
                         }
-		    }
-		  
-		  /* missing info? */
-		  if (!*hostname)
-		    continue;
-		  if (ttd == (time_t)(-1))
-		    continue;
-		  
-		  /* infinite lease to is represented by -1 */
-		  /* This makes is to the lease file as 
-		     start time one less than end time. */
-		  /* We use -1 as infinite in ttd */
-		  if ((tts != -1) && (ttd == tts - 1))
-		    ttd = (time_t)(-1);
-		  else if (ttd < now)
-		    continue;
-
-		  dot = strchr(hostname, '.');
-		  if (suffix)
-		    { 
-		      if (dot) 
-			{ /* suffix and lease has ending: must match */
-			  if (strcmp(dot+1, suffix) != 0)
-			    syslog(LOG_WARNING, 
-				   "Ignoring DHCP lease for %s because it has an illegal domain part", hostname);
-			  else
-			    cache_add_dhcp_entry(hostname, &host_address, ttd, F_REVERSE);
-			}
-		      else
-			{ /* suffix exists but lease has no ending - add lease and lease.suffix */
-			  cache_add_dhcp_entry(hostname, &host_address, ttd, 0);
-			  strncat(hostname, ".", MAXDNAME);
-			  strncat(hostname, suffix, MAXDNAME);
-			  hostname[MAXDNAME-1] = 0; /* in case strncat hit limit */
-			  /* Make FQDN canonical for reverse lookups */
-			  cache_add_dhcp_entry(hostname, &host_address, ttd, F_REVERSE);
-			}
-		    }
-		  else
-		    { /* no suffix */
-		      if (dot) /* no lease ending allowed */
-			syslog(LOG_WARNING, 
-			       "Ignoring DHCP lease for %s because it has a domain part", hostname);
-		      else
-			cache_add_dhcp_entry(hostname, &host_address, ttd, F_REVERSE);
-		    }
-		}
-	    }
-	}
-    }
+                      else
+                        { /* suffix exists but lease has no ending - add lease and lease.suffix */
+                          cache_add_dhcp_entry(hostname, &host_address, ttd, 0);
+                          strncat(hostname, ".", MAXDNAME);
+                          strncat(hostname, suffix, MAXDNAME);
+                          hostname[MAXDNAME-1] = 0; /* in case strncat hit limit */
+                          /* Make FQDN canonical for reverse lookups */
+                          cache_add_dhcp_entry(hostname, &host_address, ttd, F_REVERSE);
+                        }
+                    }
+                  else
+                    { /* no suffix */
+                      if (dot) /* no lease ending allowed */
+                        syslog(LOG_WARNING,
+                               "Ignoring DHCP lease for %s because it has a domain part", hostname);
+                      else
+                        cache_add_dhcp_entry(hostname, &host_address, ttd, F_REVERSE);
+                    }
+  }
   fclose(fp);
   
 }
-
-static int next_token (char *token, int buffsize, FILE * fp)
-{
-  int c, count = 0;
-  char *cp = token;
-  
-  while((c = getc(fp)) != EOF)
-    {
-      if (c == '#')
-	do { c = getc(fp); } while (c != '\n' && c != EOF);
-      
-      if (c == ' ' || c == '\t' || c == '\n' || c == ';')
-	{
-	  if (count)
-	    break;
-	}
-      else if ((c != '"') && (count<buffsize-1))
-	{
-	  *cp++ = c;
-	  count++;
-	}
-    }
-  
-  *cp = 0;
-  return count ? 1 : 0;
-}
-
-
-
