diff --git a/CHANGELOG b/CHANGELOG index 854992b..48fab50 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -48,8 +48,11 @@ version 2.66 Don't erroneously reject some option names in --dhcp-match options. Thnaks to Benedikt Hochstrasser for the bug report. + + Allow a trailing '*' wildcard in all interface-name + configurations. Thanks to Christian Parpart for the patch. - + version 2.65 Fix regression which broke forwarding of queries sent via TCP which are not for A and AAAA and which were directed to diff --git a/man/dnsmasq.8 b/man/dnsmasq.8 index bb19b37..f46ae52 100644 --- a/man/dnsmasq.8 +++ b/man/dnsmasq.8 @@ -171,7 +171,12 @@ options. IP alias interfaces (eg "eth1:0") cannot be used with .B --interface or .B --except-interface -options, use --listen-address instead. +options, use --listen-address instead. A simple wildcard, consisting +of a trailing '*', can be used in +.B \--interface +and +.B \--except-interface +options. .TP .B \-I, --except-interface= Do not listen on the specified interface. Note that the order of diff --git a/src/dhcp-common.c b/src/dhcp-common.c index 3f21267..8ddec58 100644 --- a/src/dhcp-common.c +++ b/src/dhcp-common.c @@ -714,8 +714,7 @@ void log_context(int family, struct dhcp_context *context) template = p; p += sprintf(p, ", "); - sprintf(p, "template for %s%s", context->template_interface, - (context->flags & CONTEXT_WILDCARD) ? "*" : ""); + sprintf(p, "template for %s", context->template_interface); } #endif diff --git a/src/dhcp.c b/src/dhcp.c index 5874e66..6b8b803 100644 --- a/src/dhcp.c +++ b/src/dhcp.c @@ -252,7 +252,7 @@ void dhcp_packet(time_t now, int pxe_fd) } for (tmp = daemon->dhcp_except; tmp; tmp = tmp->next) - if (tmp->name && (strcmp(tmp->name, ifr.ifr_name) == 0)) + if (tmp->name && wildcard_match(tmp->name, ifr.ifr_name)) return; /* unlinked contexts are marked by context->current == context */ diff --git a/src/dhcp6.c b/src/dhcp6.c index 62a6309..7d7d358 100644 --- a/src/dhcp6.c +++ b/src/dhcp6.c @@ -120,11 +120,11 @@ void dhcp6_packet(time_t now) return; for (tmp = daemon->if_except; tmp; tmp = tmp->next) - if (tmp->name && (strcmp(tmp->name, ifr.ifr_name) == 0)) + if (tmp->name && wildcard_match(tmp->name, ifr.ifr_name)) return; for (tmp = daemon->dhcp_except; tmp; tmp = tmp->next) - if (tmp->name && (strcmp(tmp->name, ifr.ifr_name) == 0)) + if (tmp->name && wildcard_match(tmp->name, ifr.ifr_name)) return; parm.current = NULL; @@ -153,7 +153,7 @@ void dhcp6_packet(time_t now) { for (tmp = daemon->if_names; tmp; tmp = tmp->next) - if (tmp->name && (strcmp(tmp->name, ifr.ifr_name) == 0)) + if (tmp->name && wildcard_match(tmp->name, ifr.ifr_name)) break; if (!tmp && !parm.addr_match) @@ -530,9 +530,7 @@ static int construct_worker(struct in6_addr *local, int prefix, } } - else if (addr6part(local) == addr6part(&template->start6) && - strncmp(template->template_interface, ifrn_name, strlen(template->template_interface)) == 0 && - (strlen(template->template_interface) == strlen(ifrn_name) || (template->flags & CONTEXT_WILDCARD))) + else if (addr6part(local) == addr6part(&template->start6) && wildcard_match(template->template_interface, ifrn_name)) { start6 = *local; setaddr6part(&start6, addr6part(&template->start6)); diff --git a/src/dnsmasq.h b/src/dnsmasq.h index 5d1cf3a..482af22 100644 --- a/src/dnsmasq.h +++ b/src/dnsmasq.h @@ -721,9 +721,8 @@ struct dhcp_context { #define CONTEXT_CONSTRUCTED 2048 #define CONTEXT_GC 4096 #define CONTEXT_RA 8192 -#define CONTEXT_WILDCARD 16384 +#define CONTEXT_CONF_USED 16384 #define CONTEXT_USED 32768 -#define CONTEXT_CONF_USED 65536 struct ping_result { struct in_addr addr; @@ -980,6 +979,8 @@ char *print_mac(char *buff, unsigned char *mac, int len); void bump_maxfd(int fd, int *max); int read_write(int fd, unsigned char *packet, int size, int rw); +int wildcard_match(const char* wildcard, const char* match); + /* log.c */ void die(char *message, char *arg1, int exit_code); int log_start(struct passwd *ent_pw, int errfd); diff --git a/src/network.c b/src/network.c index 6b7e27a..792914b 100644 --- a/src/network.c +++ b/src/network.c @@ -123,7 +123,7 @@ int iface_check(int family, struct all_addr *addr, char *name, int *auth) ret = 0; for (tmp = daemon->if_names; tmp; tmp = tmp->next) - if (tmp->name && (strcmp(tmp->name, name) == 0)) + if (tmp->name && wildcard_match(tmp->name, name)) ret = tmp->used = 1; if (addr) @@ -143,7 +143,7 @@ int iface_check(int family, struct all_addr *addr, char *name, int *auth) } for (tmp = daemon->if_except; tmp; tmp = tmp->next) - if (tmp->name && (strcmp(tmp->name, name) == 0)) + if (tmp->name && wildcard_match(tmp->name, name)) ret = 0; @@ -291,7 +291,7 @@ static int iface_allowed(struct irec **irecp, int if_index, } else for (tmp = daemon->dhcp_except; tmp; tmp = tmp->next) - if (tmp->name && (strcmp(tmp->name, ifr.ifr_name) == 0)) + if (tmp->name && wildcard_match(tmp->name, ifr.ifr_name)) { tftp_ok = 0; dhcp_ok = 0; diff --git a/src/option.c b/src/option.c index b71fd2a..8caa333 100644 --- a/src/option.c +++ b/src/option.c @@ -2375,11 +2375,6 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma new->flags |= CONTEXT_DHCP; else if (strstr(a[leasepos], "constructor:") == a[leasepos]) { - if (a[leasepos][strlen(a[leasepos])-1] == '*') - { - a[leasepos][strlen(a[leasepos])-1] = 0; - new->flags |= CONTEXT_WILDCARD; - } new->template_interface = opt_string_alloc(a[leasepos] + 12); new->flags |= CONTEXT_TEMPLATE; } diff --git a/src/radv.c b/src/radv.c index 2dc533d..a708758 100644 --- a/src/radv.c +++ b/src/radv.c @@ -158,7 +158,7 @@ void icmp6_packet(time_t now) return; for (tmp = daemon->dhcp_except; tmp; tmp = tmp->next) - if (tmp->name && (strcmp(tmp->name, interface) == 0)) + if (tmp->name && wildcard_match(tmp->name, interface)) return; if (packet[1] != 0) @@ -533,7 +533,7 @@ time_t periodic_ra(time_t now) { struct iname *tmp; for (tmp = daemon->dhcp_except; tmp; tmp = tmp->next) - if (tmp->name && (strcmp(tmp->name, interface) == 0)) + if (tmp->name && wildcard_match(tmp->name, interface)) break; if (!tmp) send_ra(now, param.iface, interface, NULL); diff --git a/src/tftp.c b/src/tftp.c index a3d111e..960b1ee 100644 --- a/src/tftp.c +++ b/src/tftp.c @@ -209,7 +209,7 @@ void tftp_request(struct listener *listen, time_t now) #ifdef HAVE_DHCP /* allowed interfaces are the same as for DHCP */ for (tmp = daemon->dhcp_except; tmp; tmp = tmp->next) - if (tmp->name && (strcmp(tmp->name, name) == 0)) + if (tmp->name && wildcard_match(tmp->name, name)) return; #endif diff --git a/src/util.c b/src/util.c index 360a85f..848e01b 100644 --- a/src/util.c +++ b/src/util.c @@ -581,3 +581,20 @@ int read_write(int fd, unsigned char *packet, int size, int rw) return 1; } +/* Basically match a string value against a wildcard pattern. */ +int wildcard_match(const char* wildcard, const char* match) +{ + while (*wildcard && *match) + { + if (*wildcard == '*') + return 1; + + if (*wildcard != *match) + return 0; + + ++wildcard; + ++match; + } + + return *wildcard == *match; +}