mirror of
http://thekelleys.org.uk/git/dnsmasq.git
synced 2026-11-06 15:51:41 +00:00
Compare commits
4
Commits
v2.88test2
...
v2.88test3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2fc904111d | ||
|
|
262dadf50e | ||
|
|
6c596f1cc1 | ||
|
|
dafa16c400 |
No files matched your search
+56
-18
@@ -379,21 +379,6 @@ static DBusMessage* dbus_read_servers_ex(DBusMessage *message, int strings)
|
|||||||
strcpy(str_addr, str);
|
strcpy(str_addr, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* parse the IP address */
|
|
||||||
if ((addr_err = parse_server(str_addr, &sdetails)) ||
|
|
||||||
(addr_err = parse_server_addr(&sdetails)))
|
|
||||||
{
|
|
||||||
error = dbus_message_new_error_printf(message, DBUS_ERROR_INVALID_ARGS,
|
|
||||||
"Invalid IP address '%s': %s",
|
|
||||||
str, addr_err);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 0.0.0.0 for server address == NULL, for Dbus */
|
|
||||||
if (addr.in.sin_family == AF_INET &&
|
|
||||||
addr.in.sin_addr.s_addr == 0)
|
|
||||||
flags |= SERV_LITERAL_ADDRESS;
|
|
||||||
|
|
||||||
if (strings)
|
if (strings)
|
||||||
{
|
{
|
||||||
char *p;
|
char *p;
|
||||||
@@ -407,7 +392,31 @@ static DBusMessage* dbus_read_servers_ex(DBusMessage *message, int strings)
|
|||||||
else
|
else
|
||||||
p = NULL;
|
p = NULL;
|
||||||
|
|
||||||
add_update_server(flags | SERV_FROM_DBUS, &addr, &source_addr, interface, str_domain, NULL);
|
if (strings && strlen(str_addr) == 0)
|
||||||
|
add_update_server(SERV_LITERAL_ADDRESS | SERV_FROM_DBUS, &addr, &source_addr, interface, str_domain, NULL);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ((addr_err = parse_server(str_addr, &sdetails)))
|
||||||
|
{
|
||||||
|
error = dbus_message_new_error_printf(message, DBUS_ERROR_INVALID_ARGS,
|
||||||
|
"Invalid IP address '%s': %s",
|
||||||
|
str, addr_err);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (parse_server_next(&sdetails))
|
||||||
|
{
|
||||||
|
if ((addr_err = parse_server_addr(&sdetails)))
|
||||||
|
{
|
||||||
|
error = dbus_message_new_error_printf(message, DBUS_ERROR_INVALID_ARGS,
|
||||||
|
"Invalid IP address '%s': %s",
|
||||||
|
str, addr_err);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
add_update_server(flags | SERV_FROM_DBUS, &addr, &source_addr, interface, str_domain, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
} while ((str_domain = p));
|
} while ((str_domain = p));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -421,11 +430,40 @@ static DBusMessage* dbus_read_servers_ex(DBusMessage *message, int strings)
|
|||||||
if (dbus_message_iter_get_arg_type(&string_iter) == DBUS_TYPE_STRING)
|
if (dbus_message_iter_get_arg_type(&string_iter) == DBUS_TYPE_STRING)
|
||||||
dbus_message_iter_get_basic(&string_iter, &str);
|
dbus_message_iter_get_basic(&string_iter, &str);
|
||||||
dbus_message_iter_next (&string_iter);
|
dbus_message_iter_next (&string_iter);
|
||||||
|
|
||||||
|
if ((addr_err = parse_server(str_addr, &sdetails)))
|
||||||
|
{
|
||||||
|
error = dbus_message_new_error_printf(message, DBUS_ERROR_INVALID_ARGS,
|
||||||
|
"Invalid IP address '%s': %s",
|
||||||
|
str, addr_err);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
add_update_server(flags | SERV_FROM_DBUS, &addr, &source_addr, interface, str, NULL);
|
while (parse_server_next(&sdetails))
|
||||||
|
{
|
||||||
|
if ((addr_err = parse_server_addr(&sdetails)))
|
||||||
|
{
|
||||||
|
error = dbus_message_new_error_printf(message, DBUS_ERROR_INVALID_ARGS,
|
||||||
|
"Invalid IP address '%s': %s",
|
||||||
|
str, addr_err);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 0.0.0.0 for server address == NULL, for Dbus */
|
||||||
|
if (addr.in.sin_family == AF_INET &&
|
||||||
|
addr.in.sin_addr.s_addr == 0)
|
||||||
|
flags |= SERV_LITERAL_ADDRESS;
|
||||||
|
else
|
||||||
|
flags &= ~SERV_LITERAL_ADDRESS;
|
||||||
|
|
||||||
|
add_update_server(flags | SERV_FROM_DBUS, &addr, &source_addr, interface, str, NULL);
|
||||||
|
}
|
||||||
} while (dbus_message_iter_get_arg_type(&string_iter) == DBUS_TYPE_STRING);
|
} while (dbus_message_iter_get_arg_type(&string_iter) == DBUS_TYPE_STRING);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sdetails.resolved)
|
||||||
|
freeaddrinfo(sdetails.hostinfo);
|
||||||
|
|
||||||
/* jump to next element in outer array */
|
/* jump to next element in outer array */
|
||||||
dbus_message_iter_next(&array_iter);
|
dbus_message_iter_next(&array_iter);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1478,6 +1478,7 @@ void reset_option_bool(unsigned int opt);
|
|||||||
struct hostsfile *expand_filelist(struct hostsfile *list);
|
struct hostsfile *expand_filelist(struct hostsfile *list);
|
||||||
char *parse_server(char *arg, struct server_details *sdetails);
|
char *parse_server(char *arg, struct server_details *sdetails);
|
||||||
char *parse_server_addr(struct server_details *sdetails);
|
char *parse_server_addr(struct server_details *sdetails);
|
||||||
|
int parse_server_next(struct server_details *sdetails);
|
||||||
int option_read_dynfile(char *file, int flags);
|
int option_read_dynfile(char *file, int flags);
|
||||||
|
|
||||||
/* forward.c */
|
/* forward.c */
|
||||||
|
|||||||
+32
-20
@@ -863,11 +863,13 @@ char *parse_server(char *arg, struct server_details *sdetails)
|
|||||||
struct addrinfo hints = { 0 };
|
struct addrinfo hints = { 0 };
|
||||||
|
|
||||||
*sdetails->interface = 0;
|
*sdetails->interface = 0;
|
||||||
|
sdetails->addr_type = AF_UNSPEC;
|
||||||
|
|
||||||
if (strcmp(arg, "#") == 0)
|
if (strcmp(arg, "#") == 0)
|
||||||
{
|
{
|
||||||
if (sdetails->flags)
|
if (sdetails->flags)
|
||||||
*sdetails->flags |= SERV_USE_RESOLV;
|
*sdetails->flags |= SERV_USE_RESOLV;
|
||||||
|
sdetails->addr_type = AF_LOCAL;
|
||||||
sdetails->valid = 1;
|
sdetails->valid = 1;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -1047,12 +1049,13 @@ char *parse_server_addr(struct server_details *sdetails)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else if (sdetails->addr_type != AF_LOCAL)
|
||||||
return _("bad address");
|
return _("bad address");
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int parse_server_next(struct server_details *sdetails)
|
int parse_server_next(struct server_details *sdetails)
|
||||||
{
|
{
|
||||||
/* Looping over resolved addresses? */
|
/* Looping over resolved addresses? */
|
||||||
if (sdetails->hostinfo)
|
if (sdetails->hostinfo)
|
||||||
@@ -1157,6 +1160,9 @@ static char *domain_rev4(int from_file, char *server, struct in_addr *addr4, int
|
|||||||
if (!add_update_server(flags, &serv_addr, &source_addr, interface, domain, NULL))
|
if (!add_update_server(flags, &serv_addr, &source_addr, interface, domain, NULL))
|
||||||
return _("error");
|
return _("error");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sdetails.resolved)
|
||||||
|
freeaddrinfo(sdetails.hostinfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1237,6 +1243,9 @@ static char *domain_rev6(int from_file, char *server, struct in6_addr *addr6, in
|
|||||||
if (!add_update_server(flags, &serv_addr, &source_addr, interface, domain, NULL))
|
if (!add_update_server(flags, &serv_addr, &source_addr, interface, domain, NULL))
|
||||||
return _("error");
|
return _("error");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sdetails.resolved)
|
||||||
|
freeaddrinfo(sdetails.hostinfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2950,7 +2959,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
|
|||||||
case LOPT_LOCAL: /* --local */
|
case LOPT_LOCAL: /* --local */
|
||||||
case 'A': /* --address */
|
case 'A': /* --address */
|
||||||
{
|
{
|
||||||
char *lastdomain = NULL, *domain = "";
|
char *lastdomain = NULL, *domain = "", *cur_domain;
|
||||||
u16 flags = 0;
|
u16 flags = 0;
|
||||||
char *err;
|
char *err;
|
||||||
union all_addr addr;
|
union all_addr addr;
|
||||||
@@ -3001,9 +3010,12 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
|
|||||||
|
|
||||||
if (servers_only && option == 'S')
|
if (servers_only && option == 'S')
|
||||||
flags |= SERV_FROM_FILE;
|
flags |= SERV_FROM_FILE;
|
||||||
|
|
||||||
|
cur_domain = domain;
|
||||||
while ((flags & SERV_LITERAL_ADDRESS) || parse_server_next(&sdetails))
|
while ((flags & SERV_LITERAL_ADDRESS) || parse_server_next(&sdetails))
|
||||||
{
|
{
|
||||||
|
cur_domain = domain;
|
||||||
|
|
||||||
if (!(flags & SERV_LITERAL_ADDRESS) && (err = parse_server_addr(&sdetails)))
|
if (!(flags & SERV_LITERAL_ADDRESS) && (err = parse_server_addr(&sdetails)))
|
||||||
ret_err(err);
|
ret_err(err);
|
||||||
|
|
||||||
@@ -3015,24 +3027,24 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
|
|||||||
{
|
{
|
||||||
/* server=//1.2.3.4 is special. */
|
/* server=//1.2.3.4 is special. */
|
||||||
if (lastdomain)
|
if (lastdomain)
|
||||||
{
|
{
|
||||||
if (strlen(domain) == 0)
|
if (strlen(cur_domain) == 0)
|
||||||
flags |= SERV_FOR_NODOTS;
|
flags |= SERV_FOR_NODOTS;
|
||||||
else
|
else
|
||||||
flags &= ~SERV_FOR_NODOTS;
|
flags &= ~SERV_FOR_NODOTS;
|
||||||
|
|
||||||
/* address=/#/ matches the same as without domain */
|
/* address=/#/ matches the same as without domain */
|
||||||
if (option == 'A' && domain[0] == '#' && domain[1] == 0)
|
if (option == 'A' && cur_domain[0] == '#' && cur_domain[1] == 0)
|
||||||
domain[0] = 0;
|
cur_domain[0] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!add_update_server(flags, sdetails.addr, sdetails.source_addr, sdetails.interface, domain, &addr))
|
if (!add_update_server(flags, sdetails.addr, sdetails.source_addr, sdetails.interface, cur_domain, &addr))
|
||||||
ret_err(gen_err);
|
ret_err(gen_err);
|
||||||
|
|
||||||
if (!lastdomain || domain == lastdomain)
|
if (!lastdomain || cur_domain == lastdomain)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
domain += strlen(domain) + 1;
|
cur_domain += strlen(cur_domain) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags & SERV_LITERAL_ADDRESS)
|
if (flags & SERV_LITERAL_ADDRESS)
|
||||||
|
|||||||
Reference in new issue
Block a user