1 /* dnsmasq is Copyright (c) 2000-2022 Simon Kelley
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; version 2 dated June, 1991, or
6 (at your option) version 3 dated 29 June, 2007.
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
13 You should have received a copy of the GNU General Public License
14 along with this program. If not, see <http://www.gnu.org/licenses/>.
21 static struct dhcp_lease *leases = NULL, *old_leases = NULL;
22 static int dns_dirty, file_dirty, leases_left;
24 static int read_leases(time_t now, FILE *leasestream)
28 struct dhcp_lease *lease;
29 int clid_len, hw_len, hw_type;
33 *daemon->dhcp_buff3 = *daemon->dhcp_buff2 = '\0';
35 /* client-id max length is 255 which is 255*2 digits + 254 colons
36 borrow DNS packet buffer which is always larger than 1000 bytes
38 Check various buffers are big enough for the code below */
40 #if (DHCP_BUFF_SZ < 255) || (MAXDNAME < 64) || (PACKETSZ+MAXDNAME+RRFIXEDSZ < 764)
41 # error Buffer size breakage in leasefile parsing.
44 while ((items=fscanf(leasestream, "%255s %255s", daemon->dhcp_buff3, daemon->dhcp_buff2)) == 2)
46 *daemon->namebuff = *daemon->dhcp_buff = *daemon->packet = '\0';
47 hw_len = hw_type = clid_len = 0;
50 if (strcmp(daemon->dhcp_buff3, "duid") == 0)
52 daemon->duid_len = parse_hex(daemon->dhcp_buff2, (unsigned char *)daemon->dhcp_buff2, 130, NULL, NULL);
53 if (daemon->duid_len < 0)
55 daemon->duid = safe_malloc(daemon->duid_len);
56 memcpy(daemon->duid, daemon->dhcp_buff2, daemon->duid_len);
61 if (fscanf(leasestream, " %64s %255s %764s",
62 daemon->namebuff, daemon->dhcp_buff, daemon->packet) != 3)
64 my_syslog(MS_DHCP | LOG_WARNING, _("ignoring invalid line in lease database: %s %s %s %s ..."),
65 daemon->dhcp_buff3, daemon->dhcp_buff2,
66 daemon->namebuff, daemon->dhcp_buff);
70 if (inet_pton(AF_INET, daemon->namebuff, &addr.addr4))
72 if ((lease = lease4_allocate(addr.addr4)))
73 domain = get_domain(lease->addr);
75 hw_len = parse_hex(daemon->dhcp_buff2, (unsigned char *)daemon->dhcp_buff2, DHCP_CHADDR_MAX, NULL, &hw_type);
76 /* For backwards compatibility, no explicit MAC address type means ether. */
77 if (hw_type == 0 && hw_len != 0)
78 hw_type = ARPHRD_ETHER;
81 else if (inet_pton(AF_INET6, daemon->namebuff, &addr.addr6))
83 char *s = daemon->dhcp_buff2;
84 int lease_type = LEASE_NA;
88 lease_type = LEASE_TA;
92 if ((lease = lease6_allocate(&addr.addr6, lease_type)))
94 lease_set_iaid(lease, strtoul(s, NULL, 10));
95 domain = get_domain6(&lease->addr6);
101 my_syslog(MS_DHCP | LOG_WARNING, _("ignoring invalid line in lease database, bad address: %s"),
108 die (_("too many stored leases"), NULL, EC_MISC);
110 if (strcmp(daemon->packet, "*") != 0)
111 clid_len = parse_hex(daemon->packet, (unsigned char *)daemon->packet, 255, NULL, NULL);
113 lease_set_hwaddr(lease, (unsigned char *)daemon->dhcp_buff2, (unsigned char *)daemon->packet,
114 hw_len, hw_type, clid_len, now, 0);
116 if (strcmp(daemon->dhcp_buff, "*") != 0)
117 lease_set_hostname(lease, daemon->dhcp_buff, 0, domain, NULL);
119 ei = atol(daemon->dhcp_buff3);
121 #ifdef HAVE_BROKEN_RTC
123 lease->expires = (time_t)ei + now;
125 lease->expires = (time_t)0;
128 /* strictly time_t is opaque, but this hack should work on all sane systems,
129 even when sizeof(time_t) == 8 */
130 lease->expires = (time_t)ei;
133 /* set these correctly: the "old" events are generated later from
134 the startup synthesised SIGHUP. */
135 lease->flags &= ~(LEASE_NEW | LEASE_CHANGED);
137 *daemon->dhcp_buff3 = *daemon->dhcp_buff2 = '\0';
140 return (items == 0 || items == EOF);
143 void lease_init(time_t now)
147 leases_left = daemon->dhcp_max;
149 if (option_bool(OPT_LEASE_RO))
151 /* run "<lease_change_script> init" once to get the
152 initial state of the database. If leasefile-ro is
153 set without a script, we just do without any
156 if (daemon->lease_change_command)
158 strcpy(daemon->dhcp_buff, daemon->lease_change_command);
159 strcat(daemon->dhcp_buff, " init");
160 leasestream = popen(daemon->dhcp_buff, "r");
165 file_dirty = dns_dirty = 0;
172 /* NOTE: need a+ mode to create file if it doesn't exist */
173 leasestream = daemon->lease_stream = fopen(daemon->lease_file, "a+");
176 die(_("cannot open or create lease file %s: %s"), daemon->lease_file, EC_FILE);
178 /* a+ mode leaves pointer at end. */
184 if (!read_leases(now, leasestream))
185 my_syslog(MS_DHCP | LOG_ERR, _("failed to parse lease database cleanly"));
187 if (ferror(leasestream))
188 die(_("failed to read lease file %s: %s"), daemon->lease_file, EC_FILE);
192 if (!daemon->lease_stream)
196 /* shell returns 127 for "command not found", 126 for bad permissions. */
197 if (!leasestream || (rc = pclose(leasestream)) == -1 || WEXITSTATUS(rc) == 127 || WEXITSTATUS(rc) == 126)
199 if (WEXITSTATUS(rc) == 127)
201 else if (WEXITSTATUS(rc) == 126)
204 die(_("cannot run lease-init script %s: %s"), daemon->lease_change_command, EC_FILE);
207 if (WEXITSTATUS(rc) != 0)
209 sprintf(daemon->dhcp_buff, "%d", WEXITSTATUS(rc));
210 die(_("lease-init script returned exit code %s"), daemon->dhcp_buff, WEXITSTATUS(rc) + EC_INIT_OFFSET);
215 /* Some leases may have expired */
217 lease_prune(NULL, now);
221 void lease_update_from_configs(void)
223 /* changes to the config may change current leases. */
225 struct dhcp_lease *lease;
226 struct dhcp_config *config;
229 for (lease = leases; lease; lease = lease->next)
230 if (lease->flags & (LEASE_TA | LEASE_NA))
232 else if ((config = find_config(daemon->dhcp_conf, NULL, lease->clid, lease->clid_len,
233 lease->hwaddr, lease->hwaddr_len, lease->hwaddr_type, NULL, NULL)) &&
234 (config->flags & CONFIG_NAME) &&
235 (!(config->flags & CONFIG_ADDR) || config->addr.s_addr == lease->addr.s_addr))
236 lease_set_hostname(lease, config->hostname, 1, get_domain(lease->addr), NULL);
237 else if ((name = host_from_dns(lease->addr)))
238 lease_set_hostname(lease, name, 1, get_domain(lease->addr), NULL); /* updates auth flag only */
241 static void ourprintf(int *errp, char *format, ...)
245 va_start(ap, format);
246 if (!(*errp) && vfprintf(daemon->lease_stream, format, ap) < 0)
251 void lease_update_file(time_t now)
253 struct dhcp_lease *lease;
257 if (file_dirty != 0 && daemon->lease_stream)
260 rewind(daemon->lease_stream);
261 if (errno != 0 || ftruncate(fileno(daemon->lease_stream), 0) != 0)
264 for (lease = leases; lease; lease = lease->next)
268 if (lease->flags & (LEASE_TA | LEASE_NA))
272 #ifdef HAVE_BROKEN_RTC
273 ourprintf(&err, "%u ", lease->length);
275 ourprintf(&err, "%lu ", (unsigned long)lease->expires);
278 if (lease->hwaddr_type != ARPHRD_ETHER || lease->hwaddr_len == 0)
279 ourprintf(&err, "%.2x-", lease->hwaddr_type);
280 for (i = 0; i < lease->hwaddr_len; i++)
282 ourprintf(&err, "%.2x", lease->hwaddr[i]);
283 if (i != lease->hwaddr_len - 1)
284 ourprintf(&err, ":");
287 inet_ntop(AF_INET, &lease->addr, daemon->addrbuff, ADDRSTRLEN);
289 ourprintf(&err, " %s ", daemon->addrbuff);
290 ourprintf(&err, "%s ", lease->hostname ? lease->hostname : "*");
292 if (lease->clid && lease->clid_len != 0)
294 for (i = 0; i < lease->clid_len - 1; i++)
295 ourprintf(&err, "%.2x:", lease->clid[i]);
296 ourprintf(&err, "%.2x\n", lease->clid[i]);
299 ourprintf(&err, "*\n");
305 ourprintf(&err, "duid ");
306 for (i = 0; i < daemon->duid_len - 1; i++)
307 ourprintf(&err, "%.2x:", daemon->duid[i]);
308 ourprintf(&err, "%.2x\n", daemon->duid[i]);
310 for (lease = leases; lease; lease = lease->next)
313 if (!(lease->flags & (LEASE_TA | LEASE_NA)))
316 #ifdef HAVE_BROKEN_RTC
317 ourprintf(&err, "%u ", lease->length);
319 ourprintf(&err, "%lu ", (unsigned long)lease->expires);
322 inet_ntop(AF_INET6, &lease->addr6, daemon->addrbuff, ADDRSTRLEN);
324 ourprintf(&err, "%s%u %s ", (lease->flags & LEASE_TA) ? "T" : "",
325 lease->iaid, daemon->addrbuff);
326 ourprintf(&err, "%s ", lease->hostname ? lease->hostname : "*");
328 if (lease->clid && lease->clid_len != 0)
330 for (i = 0; i < lease->clid_len - 1; i++)
331 ourprintf(&err, "%.2x:", lease->clid[i]);
332 ourprintf(&err, "%.2x\n", lease->clid[i]);
335 ourprintf(&err, "*\n");
340 if (fflush(daemon->lease_stream) != 0 ||
341 fsync(fileno(daemon->lease_stream)) < 0)
348 /* Set alarm for when the first lease expires. */
352 /* do timed RAs and determine when the next is, also pings to potential SLAAC addresses */
353 if (daemon->doing_ra)
357 if ((event = periodic_slaac(now, leases)) != 0)
359 if (next_event == 0 || difftime(next_event, event) > 0.0)
363 if ((event = periodic_ra(now)) != 0)
365 if (next_event == 0 || difftime(next_event, event) > 0.0)
371 for (lease = leases; lease; lease = lease->next)
372 if (lease->expires != 0 &&
373 (next_event == 0 || difftime(next_event, lease->expires) > 0.0))
374 next_event = lease->expires;
378 if (next_event == 0 || difftime(next_event, LEASE_RETRY + now) > 0.0)
379 next_event = LEASE_RETRY + now;
381 my_syslog(MS_DHCP | LOG_ERR, _("failed to write %s: %s (retry in %u s)"),
382 daemon->lease_file, strerror(err),
383 (unsigned int)difftime(next_event, now));
386 send_alarm(next_event, now);
390 static int find_interface_v4(struct in_addr local, int if_index, char *label,
391 struct in_addr netmask, struct in_addr broadcast, void *vparam)
393 struct dhcp_lease *lease;
394 int prefix = netmask_length(netmask);
400 for (lease = leases; lease; lease = lease->next)
401 if (!(lease->flags & (LEASE_TA | LEASE_NA)) &&
402 is_same_net(local, lease->addr, netmask) &&
403 prefix > lease->new_prefixlen)
405 lease->new_interface = if_index;
406 lease->new_prefixlen = prefix;
413 static int find_interface_v6(struct in6_addr *local, int prefix,
414 int scope, int if_index, int flags,
415 int preferred, int valid, void *vparam)
417 struct dhcp_lease *lease;
425 for (lease = leases; lease; lease = lease->next)
426 if ((lease->flags & (LEASE_TA | LEASE_NA)))
427 if (is_same_net6(local, &lease->addr6, prefix) && prefix > lease->new_prefixlen) {
428 /* save prefix length for comparison, as we might get shorter matching
429 * prefix in upcoming netlink GETADDR responses
431 lease->new_interface = if_index;
432 lease->new_prefixlen = prefix;
438 void lease_ping_reply(struct in6_addr *sender, unsigned char *packet, char *interface)
440 /* We may be doing RA but not DHCPv4, in which case the lease
441 database may not exist and we have nothing to do anyway */
443 slaac_ping_reply(sender, packet, interface, leases);
446 void lease_update_slaac(time_t now)
448 /* Called when we construct a new RA-names context, to add putative
449 new SLAAC addresses to existing leases. */
451 struct dhcp_lease *lease;
454 for (lease = leases; lease; lease = lease->next)
455 slaac_add_addrs(lease, now, 0);
461 /* Find interfaces associated with leases at start-up. This gets updated as
462 we do DHCP transactions, but information about directly-connected subnets
463 is useful from scrips and necessary for determining SLAAC addresses from
465 void lease_find_interfaces(time_t now)
467 struct dhcp_lease *lease;
469 for (lease = leases; lease; lease = lease->next)
470 lease->new_prefixlen = lease->new_interface = 0;
472 iface_enumerate(AF_INET, &now, find_interface_v4);
474 iface_enumerate(AF_INET6, &now, find_interface_v6);
477 for (lease = leases; lease; lease = lease->next)
478 if (lease->new_interface != 0)
479 lease_set_interface(lease, lease->new_interface, now);
483 void lease_make_duid(time_t now)
485 /* If we're not doing DHCPv6, and there are not v6 leases, don't add the DUID to the database */
486 if (!daemon->duid && daemon->doing_dhcp6)
497 void lease_update_dns(int force)
499 struct dhcp_lease *lease;
501 if (daemon->port != 0 && (dns_dirty || force))
503 #ifndef HAVE_BROKEN_RTC
504 /* force transfer to authoritative secondaries */
510 for (lease = leases; lease; lease = lease->next)
515 if (lease->flags & (LEASE_TA | LEASE_NA))
517 else if (lease->hostname || lease->fqdn)
519 struct slaac_address *slaac;
521 for (slaac = lease->slaac_address; slaac; slaac = slaac->next)
522 if (slaac->backoff == 0)
525 cache_add_dhcp_entry(lease->fqdn, AF_INET6, (union all_addr *)&slaac->addr, lease->expires);
526 if (!option_bool(OPT_DHCP_FQDN) && lease->hostname)
527 cache_add_dhcp_entry(lease->hostname, AF_INET6, (union all_addr *)&slaac->addr, lease->expires);
532 cache_add_dhcp_entry(lease->fqdn, prot,
533 prot == AF_INET ? (union all_addr *)&lease->addr : (union all_addr *)&lease->addr6,
536 if (!option_bool(OPT_DHCP_FQDN) && lease->hostname)
537 cache_add_dhcp_entry(lease->hostname, prot,
538 prot == AF_INET ? (union all_addr *)&lease->addr : (union all_addr *)&lease->addr6,
543 cache_add_dhcp_entry(lease->fqdn, prot, (union all_addr *)&lease->addr, lease->expires);
545 if (!option_bool(OPT_DHCP_FQDN) && lease->hostname)
546 cache_add_dhcp_entry(lease->hostname, prot, (union all_addr *)&lease->addr, lease->expires);
554 void lease_prune(struct dhcp_lease *target, time_t now)
556 struct dhcp_lease *lease, *tmp, **up;
558 for (lease = leases, up = &leases; lease; lease = tmp)
561 if ((lease->expires != 0 && difftime(now, lease->expires) >= 0) || lease == target)
567 daemon->metrics[lease->addr.s_addr ? METRIC_LEASES_PRUNED_4 : METRIC_LEASES_PRUNED_6]++;
569 *up = lease->next; /* unlink */
571 /* Put on old_leases list 'till we
572 can run the script */
573 lease->next = old_leases;
584 struct dhcp_lease *lease_find_by_client(unsigned char *hwaddr, int hw_len, int hw_type,
585 unsigned char *clid, int clid_len)
587 struct dhcp_lease *lease;
590 for (lease = leases; lease; lease = lease->next)
593 if (lease->flags & (LEASE_TA | LEASE_NA))
596 if (lease->clid && clid_len == lease->clid_len &&
597 memcmp(clid, lease->clid, clid_len) == 0)
601 for (lease = leases; lease; lease = lease->next)
604 if (lease->flags & (LEASE_TA | LEASE_NA))
607 if ((!lease->clid || !clid) &&
609 lease->hwaddr_len == hw_len &&
610 lease->hwaddr_type == hw_type &&
611 memcmp(hwaddr, lease->hwaddr, hw_len) == 0)
618 struct dhcp_lease *lease_find_by_addr(struct in_addr addr)
620 struct dhcp_lease *lease;
622 for (lease = leases; lease; lease = lease->next)
625 if (lease->flags & (LEASE_TA | LEASE_NA))
628 if (lease->addr.s_addr == addr.s_addr)
636 /* find address for {CLID, IAID, address} */
637 struct dhcp_lease *lease6_find(unsigned char *clid, int clid_len,
638 int lease_type, unsigned int iaid,
639 struct in6_addr *addr)
641 struct dhcp_lease *lease;
643 for (lease = leases; lease; lease = lease->next)
645 if (!(lease->flags & lease_type) || lease->iaid != iaid)
648 if (!IN6_ARE_ADDR_EQUAL(&lease->addr6, addr))
651 if ((clid_len != lease->clid_len ||
652 memcmp(clid, lease->clid, clid_len) != 0))
661 /* reset "USED flags */
662 void lease6_reset(void)
664 struct dhcp_lease *lease;
666 for (lease = leases; lease; lease = lease->next)
667 lease->flags &= ~LEASE_USED;
670 /* enumerate all leases belonging to {CLID, IAID} */
671 struct dhcp_lease *lease6_find_by_client(struct dhcp_lease *first, int lease_type,
672 unsigned char *clid, int clid_len,
675 struct dhcp_lease *lease;
682 for (lease = first; lease; lease = lease->next)
684 if (lease->flags & LEASE_USED)
687 if (!(lease->flags & lease_type) || lease->iaid != iaid)
690 if ((clid_len != lease->clid_len ||
691 memcmp(clid, lease->clid, clid_len) != 0))
700 struct dhcp_lease *lease6_find_by_addr(struct in6_addr *net, int prefix, u64 addr)
702 struct dhcp_lease *lease;
704 for (lease = leases; lease; lease = lease->next)
706 if (!(lease->flags & (LEASE_TA | LEASE_NA)))
709 if (is_same_net6(&lease->addr6, net, prefix) &&
710 (prefix == 128 || addr6part(&lease->addr6) == addr))
717 /* Find largest assigned address in context */
718 u64 lease_find_max_addr6(struct dhcp_context *context)
720 struct dhcp_lease *lease;
721 u64 addr = addr6part(&context->start6);
723 if (!(context->flags & (CONTEXT_STATIC | CONTEXT_PROXY)))
724 for (lease = leases; lease; lease = lease->next)
726 if (!(lease->flags & (LEASE_TA | LEASE_NA)))
729 if (is_same_net6(&lease->addr6, &context->start6, 64) &&
730 addr6part(&lease->addr6) > addr6part(&context->start6) &&
731 addr6part(&lease->addr6) <= addr6part(&context->end6) &&
732 addr6part(&lease->addr6) > addr)
733 addr = addr6part(&lease->addr6);
741 /* Find largest assigned address in context */
742 struct in_addr lease_find_max_addr(struct dhcp_context *context)
744 struct dhcp_lease *lease;
745 struct in_addr addr = context->start;
747 if (!(context->flags & (CONTEXT_STATIC | CONTEXT_PROXY)))
748 for (lease = leases; lease; lease = lease->next)
751 if (lease->flags & (LEASE_TA | LEASE_NA))
754 if (((unsigned)ntohl(lease->addr.s_addr)) > ((unsigned)ntohl(context->start.s_addr)) &&
755 ((unsigned)ntohl(lease->addr.s_addr)) <= ((unsigned)ntohl(context->end.s_addr)) &&
756 ((unsigned)ntohl(lease->addr.s_addr)) > ((unsigned)ntohl(addr.s_addr)))
763 static struct dhcp_lease *lease_allocate(void)
765 struct dhcp_lease *lease;
766 if (!leases_left || !(lease = whine_malloc(sizeof(struct dhcp_lease))))
769 memset(lease, 0, sizeof(struct dhcp_lease));
770 lease->flags = LEASE_NEW;
772 #ifdef HAVE_BROKEN_RTC
773 lease->length = 0xffffffff; /* illegal value */
775 lease->hwaddr_len = 256; /* illegal value */
776 lease->next = leases;
785 struct dhcp_lease *lease4_allocate(struct in_addr addr)
787 struct dhcp_lease *lease = lease_allocate();
791 daemon->metrics[METRIC_LEASES_ALLOCATED_4]++;
798 struct dhcp_lease *lease6_allocate(struct in6_addr *addrp, int lease_type)
800 struct dhcp_lease *lease = lease_allocate();
804 lease->addr6 = *addrp;
805 lease->flags |= lease_type;
808 daemon->metrics[METRIC_LEASES_ALLOCATED_6]++;
815 void lease_set_expires(struct dhcp_lease *lease, unsigned int len, time_t now)
819 if (len == 0xffffffff)
826 exp = now + (time_t)len;
827 /* Check for 2038 overflow. Make the lease
828 infinite in that case, as the least disruptive
830 if (difftime(exp, now) <= 0.0)
834 if (exp != lease->expires)
837 lease->expires = exp;
838 #ifndef HAVE_BROKEN_RTC
839 lease->flags |= LEASE_AUX_CHANGED | LEASE_EXP_CHANGED;
844 #ifdef HAVE_BROKEN_RTC
845 if (len != lease->length)
848 lease->flags |= LEASE_AUX_CHANGED;
855 void lease_set_iaid(struct dhcp_lease *lease, unsigned int iaid)
857 if (lease->iaid != iaid)
860 lease->flags |= LEASE_CHANGED;
865 void lease_set_hwaddr(struct dhcp_lease *lease, const unsigned char *hwaddr,
866 const unsigned char *clid, int hw_len, int hw_type,
867 int clid_len, time_t now, int force)
871 lease->flags |= LEASE_HAVE_HWADDR;
877 if (hw_len != lease->hwaddr_len ||
878 hw_type != lease->hwaddr_type ||
879 (hw_len != 0 && memcmp(lease->hwaddr, hwaddr, hw_len) != 0))
882 memcpy(lease->hwaddr, hwaddr, hw_len);
883 lease->hwaddr_len = hw_len;
884 lease->hwaddr_type = hw_type;
885 lease->flags |= LEASE_CHANGED;
886 file_dirty = 1; /* run script on change */
889 /* only update clid when one is available, stops packets
890 without a clid removing the record. Lease init uses
891 clid_len == 0 for no clid. */
892 if (clid_len != 0 && clid)
897 if (lease->clid_len != clid_len)
899 lease->flags |= LEASE_AUX_CHANGED;
902 if (!(lease->clid = whine_malloc(clid_len)))
908 else if (memcmp(lease->clid, clid, clid_len) != 0)
910 lease->flags |= LEASE_AUX_CHANGED;
917 lease->clid_len = clid_len;
918 memcpy(lease->clid, clid, clid_len);
923 slaac_add_addrs(lease, now, force);
927 static void kill_name(struct dhcp_lease *lease)
929 /* run script to say we lost our old name */
931 /* this shouldn't happen unless updates are very quick and the
932 script very slow, we just avoid a memory leak if it does. */
933 free(lease->old_hostname);
935 /* If we know the fqdn, pass that. The helper will derive the
936 unqualified name from it, free the unqualified name here. */
940 lease->old_hostname = lease->fqdn;
941 free(lease->hostname);
944 lease->old_hostname = lease->hostname;
946 lease->hostname = lease->fqdn = NULL;
949 void lease_set_hostname(struct dhcp_lease *lease, const char *name, int auth, char *domain, char *config_domain)
951 struct dhcp_lease *lease_tmp;
952 char *new_name = NULL, *new_fqdn = NULL;
954 if (config_domain && (!domain || !hostname_isequal(domain, config_domain)))
955 my_syslog(MS_DHCP | LOG_WARNING, _("Ignoring domain %s for DHCP host name %s"), config_domain, name);
957 if (lease->hostname && name && hostname_isequal(lease->hostname, name))
960 lease->flags |= LEASE_AUTH_NAME;
964 if (!name && !lease->hostname)
967 /* If a machine turns up on a new net without dropping the old lease,
968 or two machines claim the same name, then we end up with two interfaces with
969 the same name. Check for that here and remove the name from the old lease.
970 Note that IPv6 leases are different. All the leases to the same DUID are
971 allowed the same name.
973 Don't allow a name from the client to override a name from dnsmasq config. */
977 if ((new_name = whine_malloc(strlen(name) + 1)))
979 strcpy(new_name, name);
980 if (domain && (new_fqdn = whine_malloc(strlen(new_name) + strlen(domain) + 2)))
982 strcpy(new_fqdn, name);
983 strcat(new_fqdn, ".");
984 strcat(new_fqdn, domain);
988 /* Depending on mode, we check either unqualified name or FQDN. */
989 for (lease_tmp = leases; lease_tmp; lease_tmp = lease_tmp->next)
991 if (option_bool(OPT_DHCP_FQDN))
993 if (!new_fqdn || !lease_tmp->fqdn || !hostname_isequal(lease_tmp->fqdn, new_fqdn))
998 if (!new_name || !lease_tmp->hostname || !hostname_isequal(lease_tmp->hostname, new_name) )
1002 if (lease->flags & (LEASE_TA | LEASE_NA))
1004 if (!(lease_tmp->flags & (LEASE_TA | LEASE_NA)))
1007 /* another lease for the same DUID is OK for IPv6 */
1008 if (lease->clid_len == lease_tmp->clid_len &&
1009 lease->clid && lease_tmp->clid &&
1010 memcmp(lease->clid, lease_tmp->clid, lease->clid_len) == 0)
1013 else if (lease_tmp->flags & (LEASE_TA | LEASE_NA))
1016 if ((lease_tmp->flags & LEASE_AUTH_NAME) && !auth)
1023 kill_name(lease_tmp);
1024 lease_tmp->flags |= LEASE_CHANGED; /* run script on change */
1029 if (lease->hostname)
1032 lease->hostname = new_name;
1033 lease->fqdn = new_fqdn;
1036 lease->flags |= LEASE_AUTH_NAME;
1040 lease->flags |= LEASE_CHANGED; /* run script on change */
1043 void lease_set_interface(struct dhcp_lease *lease, int interface, time_t now)
1047 if (lease->last_interface == interface)
1050 lease->last_interface = interface;
1051 lease->flags |= LEASE_CHANGED;
1054 slaac_add_addrs(lease, now, 0);
1058 void rerun_scripts(void)
1060 struct dhcp_lease *lease;
1062 for (lease = leases; lease; lease = lease->next)
1063 lease->flags |= LEASE_CHANGED;
1066 /* deleted leases get transferred to the old_leases list.
1067 remove them here, after calling the lease change
1068 script. Also run the lease change script on new/modified leases.
1070 Return zero if nothing to do. */
1071 int do_script_run(time_t now)
1073 struct dhcp_lease *lease;
1078 /* If we're going to be sending DBus signals, but the connection is not yet up,
1079 delay everything until it is. */
1080 if (option_bool(OPT_DBUS) && !daemon->dbus)
1088 /* If the lease still has an old_hostname, do the "old" action on that first */
1089 if (lease->old_hostname)
1092 queue_script(ACTION_OLD_HOSTNAME, lease, lease->old_hostname, now);
1094 free(lease->old_hostname);
1095 lease->old_hostname = NULL;
1101 struct slaac_address *slaac, *tmp;
1102 for (slaac = lease->slaac_address; slaac; slaac = tmp)
1110 queue_script(ACTION_DEL, lease, lease->old_hostname, now);
1113 emit_dbus_signal(ACTION_DEL, lease, lease->old_hostname);
1115 old_leases = lease->next;
1117 free(lease->old_hostname);
1119 free(lease->extradata);
1126 /* make sure we announce the loss of a hostname before its new location. */
1127 for (lease = leases; lease; lease = lease->next)
1128 if (lease->old_hostname)
1131 queue_script(ACTION_OLD_HOSTNAME, lease, lease->old_hostname, now);
1133 free(lease->old_hostname);
1134 lease->old_hostname = NULL;
1138 for (lease = leases; lease; lease = lease->next)
1139 if ((lease->flags & (LEASE_NEW | LEASE_CHANGED)) ||
1140 ((lease->flags & LEASE_AUX_CHANGED) && option_bool(OPT_LEASE_RO)) ||
1141 ((lease->flags & LEASE_EXP_CHANGED) && option_bool(OPT_LEASE_RENEW)))
1144 queue_script((lease->flags & LEASE_NEW) ? ACTION_ADD : ACTION_OLD, lease,
1145 lease->fqdn ? lease->fqdn : lease->hostname, now);
1148 emit_dbus_signal((lease->flags & LEASE_NEW) ? ACTION_ADD : ACTION_OLD, lease,
1149 lease->fqdn ? lease->fqdn : lease->hostname);
1151 lease->flags &= ~(LEASE_NEW | LEASE_CHANGED | LEASE_AUX_CHANGED | LEASE_EXP_CHANGED);
1153 /* this is used for the "add" call, then junked, since they're not in the database */
1154 free(lease->extradata);
1155 lease->extradata = NULL;
1160 return 0; /* nothing to do */
1164 /* delim == -1 -> delim = 0, but embedded 0s, creating extra records, are OK. */
1165 void lease_add_extradata(struct dhcp_lease *lease, unsigned char *data, unsigned int len, int delim)
1172 /* check for embedded NULLs */
1173 for (i = 0; i < len; i++)
1180 if ((lease->extradata_size - lease->extradata_len) < (len + 1))
1182 size_t newsz = lease->extradata_len + len + 100;
1183 unsigned char *new = whine_realloc(lease->extradata, newsz);
1188 lease->extradata = new;
1189 lease->extradata_size = newsz;
1193 memcpy(lease->extradata + lease->extradata_len, data, len);
1194 lease->extradata[lease->extradata_len + len] = delim;
1195 lease->extradata_len += len + 1;
1199 #endif /* HAVE_DHCP */