e5f9af658d
SVN-Revision: 30
220 lines
7.3 KiB
Diff
220 lines
7.3 KiB
Diff
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;
|
|
-}
|
|
-
|
|
-
|
|
-
|