/* Add a lease into the table, clearing out any old ones. * If chaddr == NULL, this is a conflict lease. */ struct dyn_lease* FAST_FUNC add_lease( const uint8_t *chaddr, uint32_t yiaddr, leasetime_t leasetime, const char *hostname, int hostname_len) { struct dyn_lease *oldest; /* clean out any old ones */ clear_leases(chaddr, yiaddr); oldest = oldest_expired_lease(); if (oldest) { memset(oldest, 0, sizeof(*oldest)); if (hostname) { char *p; hostname_len++; /* include NUL */ if (hostname_len > sizeof(oldest->hostname)) hostname_len = sizeof(oldest->hostname); p = safe_strncpy(oldest->hostname, hostname, hostname_len); /* * Sanitization (s/bad_char/./g). * The intent is not to allow only "DNS-valid" hostnames, * but merely make dumpleases output safe for shells to use. * We accept "0-9A-Za-z._-", all other chars turn to dots. */ while (*p) { if (!isalnum(*p) && *p != '-' && *p != '_') *p = '.'; p++; } } if (chaddr) memcpy(oldest->lease_mac, chaddr, 6); oldest->lease_nip = yiaddr; oldest->expires = time(NULL) + leasetime; } return oldest; }
/* Add a lease into the table, clearing out any old ones. * If chaddr == NULL, this is a conflict lease. */ struct dyn_lease* FAST_FUNC add_lease( const uint8_t *chaddr, uint32_t yiaddr, leasetime_t leasetime, const char *hostname, int hostname_len) { struct dyn_lease *oldest; /* clean out any old ones */ clear_leases(chaddr, yiaddr); oldest = oldest_expired_lease(); if (oldest) { memset(oldest, 0, sizeof(*oldest)); if (hostname) { char *p; hostname_len++; /* include NUL */ if (hostname_len > sizeof(oldest->hostname)) hostname_len = sizeof(oldest->hostname); p = safe_strncpy(oldest->hostname, hostname, hostname_len); /* sanitization (s/non-ASCII/^/g) */ while (*p) { if (*p < ' ' || *p > 126) *p = '^'; p++; } } if (chaddr) memcpy(oldest->lease_mac, chaddr, 6); oldest->lease_nip = yiaddr; oldest->expires = time(NULL) + leasetime; } return oldest; }