Initial revision
[oweals/openwrt.git] / obsolete-buildroot / sources / dnsmasq1-openwrt.patch
1 diff -x CVS -urN dnsmasq-1.18/dhcp.c dnsmasq.old/dhcp.c
2 --- dnsmasq-1.18/dhcp.c 2003-11-05 08:30:20.000000000 -0600
3 +++ dnsmasq.old/dhcp.c  2004-01-05 23:40:11.000000000 -0600
4 @@ -15,14 +15,20 @@
5  
6  #include "dnsmasq.h"
7  
8 -static int next_token (char *token, int buffsize, FILE * fp);
9 +struct dhcpOfferedAddr {
10 +        u_int8_t hostname[16];
11 +        u_int8_t chaddr[16];
12 +        u_int32_t yiaddr;       /* network order */
13 +        u_int32_t expires;      /* host order */
14 +};
15  
16  void load_dhcp(char *file, char *suffix, time_t now, char *hostname)
17  {
18 -  char token[MAXTOK], *dot;
19 +  char *dot;
20    struct all_addr host_address;
21 -  time_t ttd, tts;
22 +  time_t ttd;
23    FILE *fp = fopen (file, "r");
24 +  struct dhcpOfferedAddr lease;
25    
26    if (!fp)
27      {
28 @@ -34,154 +40,45 @@
29  
30    /* remove all existing DHCP cache entries */
31    cache_unhash_dhcp();
32 -  
33 -  while ((next_token(token, MAXTOK, fp)))
34 -    {
35 -      if (strcmp(token, "lease") == 0)
36 -        {
37 -          hostname[0] = '\0';
38 -         ttd = tts = (time_t)(-1);
39 -#ifdef HAVE_IPV6
40 -          if (next_token(token, MAXTOK, fp) && 
41 -             inet_pton(AF_INET, token, &host_address))
42 -#else
43 -         if (next_token(token, MAXTOK, fp) && 
44 -             (host_address.addr4.s_addr = inet_addr(token)) != (in_addr_t) -1)
45 -#endif
46 -            {
47 -              if (next_token(token, MAXTOK, fp) && *token == '{')
48 -                {
49 -                  while (next_token(token, MAXTOK, fp) && *token != '}')
50 +
51 +  while (fread(&lease, sizeof(lease), 1, fp)) {  
52 +         host_address.addr.addr4.s_addr = lease.yiaddr;
53 +
54 +       strcpy(hostname,lease.hostname);
55 +       if (lease.expires>(unsigned)now)
56 +       ttd = lease.expires;
57 +       else
58 +       ttd = -1;
59 +                  dot = strchr(hostname, '.');
60 +                  if (suffix)
61                      {
62 -                      if ((strcmp(token, "client-hostname") == 0) ||
63 -                         (strcmp(token, "hostname") == 0))
64 -                       {
65 -                         if (next_token(hostname, MAXDNAME, fp))
66 -                           if (!canonicalise(hostname))
67 -                             {
68 -                               *hostname = 0;
69 -                               syslog(LOG_ERR, "bad name in %s", file); 
70 -                             }
71 -                       }
72 -                      else if ((strcmp(token, "ends") == 0) ||
73 -                              (strcmp(token, "starts") == 0))
74 -                        {
75 -                          struct tm lease_time;
76 -                         int is_ends = (strcmp(token, "ends") == 0);
77 -                         if (next_token(token, MAXTOK, fp) &&  /* skip weekday */
78 -                             next_token(token, MAXTOK, fp) &&  /* Get date from lease file */
79 -                             sscanf (token, "%d/%d/%d", 
80 -                                     &lease_time.tm_year,
81 -                                     &lease_time.tm_mon,
82 -                                     &lease_time.tm_mday) == 3 &&
83 -                             next_token(token, MAXTOK, fp) &&
84 -                             sscanf (token, "%d:%d:%d:", 
85 -                                     &lease_time.tm_hour,
86 -                                     &lease_time.tm_min, 
87 -                                     &lease_time.tm_sec) == 3)
88 -                           {
89 -                             /* There doesn't seem to be a universally available library function
90 -                                which converts broken-down _GMT_ time to seconds-in-epoch.
91 -                                The following was borrowed from ISC dhcpd sources, where
92 -                                 it is noted that it might not be entirely accurate for odd seconds.
93 -                                Since we're trying to get the same answer as dhcpd, that's just
94 -                                fine here. */
95 -                             static int months [11] = { 31, 59, 90, 120, 151, 181,
96 -                                                        212, 243, 273, 304, 334 };
97 -                             time_t time = ((((((365 * (lease_time.tm_year - 1970) + /* Days in years since '70 */
98 -                                                 (lease_time.tm_year - 1969) / 4 +   /* Leap days since '70 */
99 -                                                 (lease_time.tm_mon > 1                /* Days in months this year */
100 -                                                  ? months [lease_time.tm_mon - 2]
101 -                                                  : 0) +
102 -                                                 (lease_time.tm_mon > 2 &&         /* Leap day this year */
103 -                                                  !((lease_time.tm_year - 1972) & 3)) +
104 -                                                 lease_time.tm_mday - 1) * 24) +   /* Day of month */
105 -                                               lease_time.tm_hour) * 60) +
106 -                                             lease_time.tm_min) * 60) + lease_time.tm_sec;
107 -                             if (is_ends)
108 -                               ttd = time;
109 -                             else
110 -                               tts = time;                         }
111 +                      if (dot)
112 +                        { /* suffix and lease has ending: must match */
113 +                          if (strcmp(dot+1, suffix) != 0)
114 +                            syslog(LOG_WARNING,
115 +                                   "Ignoring DHCP lease for %s because it has an illegal domain part", hostname);
116 +                          else
117 +                            cache_add_dhcp_entry(hostname, &host_address, ttd, F_REVERSE);
118                          }
119 -                   }
120 -                 
121 -                 /* missing info? */
122 -                 if (!*hostname)
123 -                   continue;
124 -                 if (ttd == (time_t)(-1))
125 -                   continue;
126 -                 
127 -                 /* infinite lease to is represented by -1 */
128 -                 /* This makes is to the lease file as 
129 -                    start time one less than end time. */
130 -                 /* We use -1 as infinite in ttd */
131 -                 if ((tts != -1) && (ttd == tts - 1))
132 -                   ttd = (time_t)(-1);
133 -                 else if (ttd < now)
134 -                   continue;
135 -
136 -                 dot = strchr(hostname, '.');
137 -                 if (suffix)
138 -                   { 
139 -                     if (dot) 
140 -                       { /* suffix and lease has ending: must match */
141 -                         if (strcmp(dot+1, suffix) != 0)
142 -                           syslog(LOG_WARNING, 
143 -                                  "Ignoring DHCP lease for %s because it has an illegal domain part", hostname);
144 -                         else
145 -                           cache_add_dhcp_entry(hostname, &host_address, ttd, F_REVERSE);
146 -                       }
147 -                     else
148 -                       { /* suffix exists but lease has no ending - add lease and lease.suffix */
149 -                         cache_add_dhcp_entry(hostname, &host_address, ttd, 0);
150 -                         strncat(hostname, ".", MAXDNAME);
151 -                         strncat(hostname, suffix, MAXDNAME);
152 -                         hostname[MAXDNAME-1] = 0; /* in case strncat hit limit */
153 -                         /* Make FQDN canonical for reverse lookups */
154 -                         cache_add_dhcp_entry(hostname, &host_address, ttd, F_REVERSE);
155 -                       }
156 -                   }
157 -                 else
158 -                   { /* no suffix */
159 -                     if (dot) /* no lease ending allowed */
160 -                       syslog(LOG_WARNING, 
161 -                              "Ignoring DHCP lease for %s because it has a domain part", hostname);
162 -                     else
163 -                       cache_add_dhcp_entry(hostname, &host_address, ttd, F_REVERSE);
164 -                   }
165 -               }
166 -           }
167 -       }
168 -    }
169 +                      else
170 +                        { /* suffix exists but lease has no ending - add lease and lease.suffix */
171 +                          cache_add_dhcp_entry(hostname, &host_address, ttd, 0);
172 +                          strncat(hostname, ".", MAXDNAME);
173 +                          strncat(hostname, suffix, MAXDNAME);
174 +                          hostname[MAXDNAME-1] = 0; /* in case strncat hit limit */
175 +                          /* Make FQDN canonical for reverse lookups */
176 +                          cache_add_dhcp_entry(hostname, &host_address, ttd, F_REVERSE);
177 +                        }
178 +                    }
179 +                  else
180 +                    { /* no suffix */
181 +                      if (dot) /* no lease ending allowed */
182 +                        syslog(LOG_WARNING,
183 +                               "Ignoring DHCP lease for %s because it has a domain part", hostname);
184 +                      else
185 +                        cache_add_dhcp_entry(hostname, &host_address, ttd, F_REVERSE);
186 +                    }
187 +  }
188    fclose(fp);
189    
190  }
191 -
192 -static int next_token (char *token, int buffsize, FILE * fp)
193 -{
194 -  int c, count = 0;
195 -  char *cp = token;
196 -  
197 -  while((c = getc(fp)) != EOF)
198 -    {
199 -      if (c == '#')
200 -       do { c = getc(fp); } while (c != '\n' && c != EOF);
201 -      
202 -      if (c == ' ' || c == '\t' || c == '\n' || c == ';')
203 -       {
204 -         if (count)
205 -           break;
206 -       }
207 -      else if ((c != '"') && (count<buffsize-1))
208 -       {
209 -         *cp++ = c;
210 -         count++;
211 -       }
212 -    }
213 -  
214 -  *cp = 0;
215 -  return count ? 1 : 0;
216 -}
217 -
218 -
219 -