mirror of
http://thekelleys.org.uk/git/dnsmasq.git
synced 2026-11-06 15:51:41 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
46bdfe691a | ||
|
|
dded78b233 | ||
|
|
b594e8defa | ||
|
|
70c50efd0d | ||
|
|
ea3c60ac07 |
No files matched your search
+1
-1
@@ -649,7 +649,7 @@ static const struct opttab_t opttab6[] = {
|
||||
{ "sntp-server", 31, OT_ADDR_LIST },
|
||||
{ "information-refresh-time", 32, OT_TIME },
|
||||
{ "FQDN", 39, OT_INTERNAL | OT_RFC1035_NAME },
|
||||
{ "ntp-server", 56, 0 },
|
||||
{ "ntp-server", 56, 0 /* OT_ADDR_LIST | OT_RFC1035_NAME */ },
|
||||
{ "bootfile-url", 59, OT_NAME },
|
||||
{ "bootfile-param", 60, OT_CSTRING },
|
||||
{ NULL, 0, 0 }
|
||||
|
||||
@@ -59,8 +59,12 @@
|
||||
#define OPTION6_REMOTE_ID 37
|
||||
#define OPTION6_SUBSCRIBER_ID 38
|
||||
#define OPTION6_FQDN 39
|
||||
#define OPTION6_NTP_SERVER 56
|
||||
#define OPTION6_CLIENT_MAC 79
|
||||
|
||||
#define NTP_SUBOPTION_SRV_ADDR 1
|
||||
#define NTP_SUBOPTION_MC_ADDR 2
|
||||
#define NTP_SUBOPTION_SRV_FQDN 3
|
||||
|
||||
#define DHCP6SUCCESS 0
|
||||
#define DHCP6UNSPEC 1
|
||||
|
||||
+3
-1
@@ -1860,7 +1860,8 @@ static void check_dns_listeners(time_t now)
|
||||
if (daemon->tcp_pids[i] == 0 && daemon->tcp_pipes[i] == -1)
|
||||
{
|
||||
char a;
|
||||
|
||||
(void)a; /* suppress potential unused warning */
|
||||
|
||||
daemon->tcp_pids[i] = p;
|
||||
daemon->tcp_pipes[i] = pipefd[0];
|
||||
#ifdef HAVE_LINUX_NETWORK
|
||||
@@ -1911,6 +1912,7 @@ static void check_dns_listeners(time_t now)
|
||||
if (!option_bool(OPT_DEBUG))
|
||||
{
|
||||
char a = 0;
|
||||
(void)a; /* suppress potential unused warning */
|
||||
alarm(CHILD_LIFETIME);
|
||||
close(pipefd[0]); /* close read end in child. */
|
||||
daemon->pipe_to_parent = pipefd[1];
|
||||
|
||||
+6
-3
@@ -93,10 +93,13 @@ int send_from(int fd, int nowild, char *packet, size_t len,
|
||||
|
||||
while (retry_send(sendmsg(fd, &msg, 0)));
|
||||
|
||||
/* If interface is still in DAD, EINVAL results - ignore that. */
|
||||
if (errno != 0 && errno != EINVAL)
|
||||
if (errno != 0)
|
||||
{
|
||||
my_syslog(LOG_ERR, _("failed to send packet: %s"), strerror(errno));
|
||||
#ifdef HAVE_LINUX_NETWORK
|
||||
/* If interface is still in DAD, EINVAL results - ignore that. */
|
||||
if (errno != EINVAL)
|
||||
my_syslog(LOG_ERR, _("failed to send packet: %s"), strerror(errno));
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -785,6 +785,8 @@ int set_ipv6pktinfo(int fd)
|
||||
/* Find the interface on which a TCP connection arrived, if possible, or zero otherwise. */
|
||||
int tcp_interface(int fd, int af)
|
||||
{
|
||||
(void)fd; /* suppress potential unused warning */
|
||||
(void)af; /* suppress potential unused warning */
|
||||
int if_index = 0;
|
||||
|
||||
#ifdef HAVE_LINUX_NETWORK
|
||||
@@ -1187,6 +1189,7 @@ int local_bind(int fd, union mysockaddr *addr, char *intname, unsigned int ifind
|
||||
#endif
|
||||
}
|
||||
|
||||
(void)intname; /* suppress potential unused warning */
|
||||
#if defined(SO_BINDTODEVICE)
|
||||
if (intname[0] != 0 &&
|
||||
setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, intname, IF_NAMESIZE) == -1)
|
||||
|
||||
+17
-4
@@ -1260,6 +1260,12 @@ static int parse_dhcp_opt(char *errstr, char *arg, int flags)
|
||||
|
||||
if (!found_colon)
|
||||
is_addr6 = 0;
|
||||
|
||||
#ifdef HAVE_DHCP6
|
||||
/* NTP server option takes hex, addresses or FQDN */
|
||||
if (is6 && new->opt == OPTION6_NTP_SERVER && !is_hex)
|
||||
opt_len |= is_addr6 ? OT_ADDR_LIST : OT_RFC1035_NAME;
|
||||
#endif
|
||||
|
||||
/* We know that some options take addresses */
|
||||
if (opt_len & OT_ADDR_LIST)
|
||||
@@ -1521,8 +1527,9 @@ static int parse_dhcp_opt(char *errstr, char *arg, int flags)
|
||||
}
|
||||
else if (comma && (opt_len & OT_RFC1035_NAME))
|
||||
{
|
||||
unsigned char *p = NULL, *newp, *end;
|
||||
unsigned char *p = NULL, *q, *newp, *end;
|
||||
int len = 0;
|
||||
int header_size = (is6 && new->opt == OPTION6_NTP_SERVER) ? 4 : 0;
|
||||
arg = comma;
|
||||
comma = split(arg);
|
||||
|
||||
@@ -1532,7 +1539,7 @@ static int parse_dhcp_opt(char *errstr, char *arg, int flags)
|
||||
if (!dom)
|
||||
goto_err(_("bad domain in dhcp-option"));
|
||||
|
||||
newp = opt_malloc(len + strlen(dom) + 2);
|
||||
newp = opt_malloc(len + header_size + strlen(dom) + 2);
|
||||
|
||||
if (p)
|
||||
{
|
||||
@@ -1541,8 +1548,14 @@ static int parse_dhcp_opt(char *errstr, char *arg, int flags)
|
||||
}
|
||||
|
||||
p = newp;
|
||||
end = do_rfc1035_name(p + len, dom, NULL);
|
||||
q = p + len;
|
||||
end = do_rfc1035_name(q + header_size, dom, NULL);
|
||||
*end++ = 0;
|
||||
if (is6 && new->opt == OPTION6_NTP_SERVER)
|
||||
{
|
||||
PUTSHORT(NTP_SUBOPTION_SRV_FQDN, q);
|
||||
PUTSHORT(end - q - 2, q);
|
||||
}
|
||||
len = end - p;
|
||||
free(dom);
|
||||
|
||||
@@ -3309,7 +3322,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
|
||||
|
||||
if (!atoi_check(pref, &new_addr->prefixlen) ||
|
||||
new_addr->prefixlen > 128 ||
|
||||
(((1<<(128-new_addr->prefixlen))-1) & addrpart) != 0)
|
||||
((((u64)1<<(128-new_addr->prefixlen))-1) & addrpart) != 0)
|
||||
{
|
||||
dhcp_config_free(new);
|
||||
ret_err(_("bad IPv6 prefix"));
|
||||
|
||||
+22
-6
@@ -1311,23 +1311,39 @@ static struct dhcp_netid *add_options(struct state *state, int do_refresh)
|
||||
|
||||
for (a = (struct in6_addr *)opt_cfg->val, j = 0; j < opt_cfg->len; j+=IN6ADDRSZ, a++)
|
||||
{
|
||||
struct in6_addr *p = NULL;
|
||||
|
||||
if (IN6_IS_ADDR_UNSPECIFIED(a))
|
||||
{
|
||||
if (!add_local_addrs(state->context))
|
||||
put_opt6(state->fallback, IN6ADDRSZ);
|
||||
p = state->fallback;
|
||||
}
|
||||
else if (IN6_IS_ADDR_ULA_ZERO(a))
|
||||
{
|
||||
if (!IN6_IS_ADDR_UNSPECIFIED(state->ula_addr))
|
||||
put_opt6(state->ula_addr, IN6ADDRSZ);
|
||||
p = state->ula_addr;
|
||||
}
|
||||
else if (IN6_IS_ADDR_LINK_LOCAL_ZERO(a))
|
||||
{
|
||||
if (!IN6_IS_ADDR_UNSPECIFIED(state->ll_addr))
|
||||
put_opt6(state->ll_addr, IN6ADDRSZ);
|
||||
p = state->ll_addr;
|
||||
}
|
||||
else
|
||||
put_opt6(a, IN6ADDRSZ);
|
||||
p = a;
|
||||
|
||||
if (!p)
|
||||
continue;
|
||||
else if (opt_cfg->opt == OPTION6_NTP_SERVER)
|
||||
{
|
||||
if (IN6_IS_ADDR_MULTICAST(p))
|
||||
o1 = new_opt6(NTP_SUBOPTION_MC_ADDR);
|
||||
else
|
||||
o1 = new_opt6(NTP_SUBOPTION_SRV_ADDR);
|
||||
put_opt6(p, IN6ADDRSZ);
|
||||
end_opt6(o1);
|
||||
}
|
||||
else
|
||||
put_opt6(p, IN6ADDRSZ);
|
||||
}
|
||||
|
||||
end_opt6(o);
|
||||
@@ -1708,14 +1724,14 @@ static int config_valid(struct dhcp_config *config, struct dhcp_context *context
|
||||
return 0;
|
||||
|
||||
for (addr_list = config->addr6; addr_list; addr_list = addr_list->next)
|
||||
if (!(addr_list->flags && ADDRLIST_DECLINED) ||
|
||||
if (!(addr_list->flags & ADDRLIST_DECLINED) ||
|
||||
difftime(now, addr_list->decline_time) >= (float)DECLINE_BACKOFF)
|
||||
{
|
||||
addrpart = addr6part(&addr_list->addr.addr6);
|
||||
addresses = 1;
|
||||
|
||||
if (addr_list->flags & ADDRLIST_PREFIX)
|
||||
addresses = 1<<(128-addr_list->prefixlen);
|
||||
addresses = (u64)1<<(128-addr_list->prefixlen);
|
||||
|
||||
if ((addr_list->flags & ADDRLIST_WILDCARD))
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user