Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
D
Dnsmasq
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nanahira
Dnsmasq
Commits
faafb3f7
Commit
faafb3f7
authored
Sep 20, 2012
by
Simon Kelley
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add SetServersEX method in DBus interface.
parent
2b127a1e
Changes
5
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
371 additions
and
165 deletions
+371
-165
CHANGELOG
CHANGELOG
+3
-0
dbus/DBus-interface
dbus/DBus-interface
+42
-0
src/dbus.c
src/dbus.c
+233
-87
src/dnsmasq.h
src/dnsmasq.h
+2
-0
src/option.c
src/option.c
+91
-78
No files found.
CHANGELOG
View file @
faafb3f7
...
...
@@ -19,6 +19,9 @@ version 2.64
Flag DHCP or DHCPv6 in starup logging. Thanks to
Vladislav Grishenko for the patch.
Add SetServersEX method in DBus interface. Thanks to Dan
Williams for the patch.
version 2.63
Do duplicate dhcp-host address check in --test mode.
...
...
dbus/DBus-interface
View file @
faafb3f7
...
...
@@ -95,6 +95,48 @@ Each call to SetServers completely replaces the set of servers
specified by via the DBus, but it leaves any servers specified via the
command line or /etc/dnsmasq.conf or /etc/resolv.conf alone.
SetServersEx
------------
This function is more flexible and the SetServers function, in that it can
handle address scoping, port numbers, and is easier for clients to use.
Returns nothing. Takes a set of arguments representing the new
upstream DNS servers to be used by dnsmasq. All addresses (both IPv4 and IPv6)
are represented as STRINGS. Each server address may be followed by one or more
STRINGS, which are the domains for which the preceding server should be used.
This function takes an array of STRING arrays, where each inner array represents
a set of DNS servers and domains for which those servers may be used. Each
string represents a list of upstream DNS servers first, and domains second.
Mixing of domains and servers within a the string array is not allowed.
Examples.
[
["1.2.3.4", "foobar.com"],
["1003:1234:abcd::1%eth0", "eng.mycorp.com", "lab.mycorp.com"]
]
is equivalent to
--server=/foobar.com/1.2.3.4 \
--server=/eng.mycorp.com/lab.mycorp.com/1003:1234:abcd::1%eth0
An IPv4 address of 0.0.0.0 is interpreted as "no address, local only",
so
[ ["0.0.0.0", "local.domain"] ]
is equivalent to
--local=/local.domain/
Each call to SetServersEx completely replaces the set of servers
specified by via the DBus, but it leaves any servers specified via the
command line or /etc/dnsmasq.conf or /etc/resolv.conf alone.
2. SIGNALS
----------
...
...
src/dbus.c
View file @
faafb3f7
This diff is collapsed.
Click to expand it.
src/dnsmasq.h
View file @
faafb3f7
...
...
@@ -928,6 +928,8 @@ void reread_dhcp(void);
void
set_option_bool
(
unsigned
int
opt
);
void
reset_option_bool
(
unsigned
int
opt
);
struct
hostsfile
*
expand_filelist
(
struct
hostsfile
*
list
);
char
*
parse_server
(
char
*
arg
,
union
mysockaddr
*
addr
,
union
mysockaddr
*
source_addr
,
char
*
interface
,
int
*
flags
);
/* forward.c */
void
reply_query
(
int
fd
,
int
family
,
time_t
now
);
...
...
src/option.c
View file @
faafb3f7
...
...
@@ -621,6 +621,93 @@ static char *set_prefix(char *arg)
return
arg
;
}
char
*
parse_server
(
char
*
arg
,
union
mysockaddr
*
addr
,
union
mysockaddr
*
source_addr
,
char
*
interface
,
int
*
flags
)
{
int
source_port
=
0
,
serv_port
=
NAMESERVER_PORT
;
char
*
portno
,
*
source
;
#ifdef HAVE_IPV6
int
scope_index
=
0
;
char
*
scope_id
;
#endif
if
((
source
=
split_chr
(
arg
,
'@'
))
&&
/* is there a source. */
(
portno
=
split_chr
(
source
,
'#'
))
&&
!
atoi_check16
(
portno
,
&
source_port
))
return
_
(
"bad port"
);
if
((
portno
=
split_chr
(
arg
,
'#'
))
&&
/* is there a port no. */
!
atoi_check16
(
portno
,
&
serv_port
))
return
_
(
"bad port"
);
#ifdef HAVE_IPV6
scope_id
=
split_chr
(
arg
,
'%'
);
#endif
if
((
addr
->
in
.
sin_addr
.
s_addr
=
inet_addr
(
arg
))
!=
(
in_addr_t
)
-
1
)
{
addr
->
in
.
sin_port
=
htons
(
serv_port
);
addr
->
sa
.
sa_family
=
source_addr
->
sa
.
sa_family
=
AF_INET
;
#ifdef HAVE_SOCKADDR_SA_LEN
source_addr
->
in
.
sin_len
=
addr
->
in
.
sin_len
=
sizeof
(
struct
sockaddr_in
);
#endif
source_addr
->
in
.
sin_addr
.
s_addr
=
INADDR_ANY
;
source_addr
->
in
.
sin_port
=
htons
(
daemon
->
query_port
);
if
(
source
)
{
if
(
flags
)
*
flags
|=
SERV_HAS_SOURCE
;
source_addr
->
in
.
sin_port
=
htons
(
source_port
);
if
((
source_addr
->
in
.
sin_addr
.
s_addr
=
inet_addr
(
source
))
==
(
in_addr_t
)
-
1
)
{
#if defined(SO_BINDTODEVICE)
source_addr
->
in
.
sin_addr
.
s_addr
=
INADDR_ANY
;
strncpy
(
interface
,
source
,
IF_NAMESIZE
-
1
);
#else
return
_
(
"interface binding not supported"
);
#endif
}
}
}
#ifdef HAVE_IPV6
else
if
(
inet_pton
(
AF_INET6
,
arg
,
&
addr
->
in6
.
sin6_addr
)
>
0
)
{
if
(
scope_id
&&
(
scope_index
=
if_nametoindex
(
scope_id
))
==
0
)
return
_
(
"bad interface name"
);
addr
->
in6
.
sin6_port
=
htons
(
serv_port
);
addr
->
in6
.
sin6_scope_id
=
scope_index
;
source_addr
->
in6
.
sin6_addr
=
in6addr_any
;
source_addr
->
in6
.
sin6_port
=
htons
(
daemon
->
query_port
);
source_addr
->
in6
.
sin6_scope_id
=
0
;
addr
->
sa
.
sa_family
=
source_addr
->
sa
.
sa_family
=
AF_INET6
;
addr
->
in6
.
sin6_flowinfo
=
source_addr
->
in6
.
sin6_flowinfo
=
0
;
#ifdef HAVE_SOCKADDR_SA_LEN
addr
->
in6
.
sin6_len
=
source_addr
->
in6
.
sin6_len
=
sizeof
(
addr
->
in6
);
#endif
if
(
source
)
{
if
(
flags
)
*
flags
|=
SERV_HAS_SOURCE
;
source_addr
->
in6
.
sin6_port
=
htons
(
source_port
);
if
(
inet_pton
(
AF_INET6
,
source
,
&
source_addr
->
in6
.
sin6_addr
)
==
0
)
{
#if defined(SO_BINDTODEVICE)
source_addr
->
in6
.
sin6_addr
=
in6addr_any
;
strncpy
(
interface
,
source
,
IF_NAMESIZE
-
1
);
#else
return
_
(
"interface binding not supported"
);
#endif
}
}
}
#endif
else
return
_
(
"bad address"
);
return
NULL
;
}
/* This is too insanely large to keep in-line in the switch */
static
int
parse_dhcp_opt
(
char
*
errstr
,
char
*
arg
,
int
flags
)
{
...
...
@@ -1760,84 +1847,9 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
}
else
{
int
source_port
=
0
,
serv_port
=
NAMESERVER_PORT
;
char
*
portno
,
*
source
;
#ifdef HAVE_IPV6
int
scope_index
=
0
;
char
*
scope_id
;
#endif
if
((
source
=
split_chr
(
arg
,
'@'
))
&&
/* is there a source. */
(
portno
=
split_chr
(
source
,
'#'
))
&&
!
atoi_check16
(
portno
,
&
source_port
))
ret_err
(
_
(
"bad port"
));
if
((
portno
=
split_chr
(
arg
,
'#'
))
&&
/* is there a port no. */
!
atoi_check16
(
portno
,
&
serv_port
))
ret_err
(
_
(
"bad port"
));
#ifdef HAVE_IPV6
scope_id
=
split_chr
(
arg
,
'%'
);
#endif
if
((
newlist
->
addr
.
in
.
sin_addr
.
s_addr
=
inet_addr
(
arg
))
!=
(
in_addr_t
)
-
1
)
{
newlist
->
addr
.
in
.
sin_port
=
htons
(
serv_port
);
newlist
->
source_addr
.
in
.
sin_port
=
htons
(
source_port
);
newlist
->
addr
.
sa
.
sa_family
=
newlist
->
source_addr
.
sa
.
sa_family
=
AF_INET
;
#ifdef HAVE_SOCKADDR_SA_LEN
newlist
->
source_addr
.
in
.
sin_len
=
newlist
->
addr
.
in
.
sin_len
=
sizeof
(
struct
sockaddr_in
);
#endif
if
(
source
)
{
newlist
->
flags
|=
SERV_HAS_SOURCE
;
if
((
newlist
->
source_addr
.
in
.
sin_addr
.
s_addr
=
inet_addr
(
source
))
==
(
in_addr_t
)
-
1
)
{
#if defined(SO_BINDTODEVICE)
newlist
->
source_addr
.
in
.
sin_addr
.
s_addr
=
INADDR_ANY
;
strncpy
(
newlist
->
interface
,
source
,
IF_NAMESIZE
-
1
);
#else
ret_err
(
_
(
"interface binding not supported"
));
#endif
}
}
else
newlist
->
source_addr
.
in
.
sin_addr
.
s_addr
=
INADDR_ANY
;
}
#ifdef HAVE_IPV6
else
if
(
inet_pton
(
AF_INET6
,
arg
,
&
newlist
->
addr
.
in6
.
sin6_addr
)
>
0
)
{
if
(
scope_id
&&
(
scope_index
=
if_nametoindex
(
scope_id
))
==
0
)
ret_err
(
_
(
"bad interface name"
));
newlist
->
addr
.
in6
.
sin6_port
=
htons
(
serv_port
);
newlist
->
addr
.
in6
.
sin6_scope_id
=
scope_index
;
newlist
->
source_addr
.
in6
.
sin6_port
=
htons
(
source_port
);
newlist
->
source_addr
.
in6
.
sin6_scope_id
=
0
;
newlist
->
addr
.
sa
.
sa_family
=
newlist
->
source_addr
.
sa
.
sa_family
=
AF_INET6
;
newlist
->
addr
.
in6
.
sin6_flowinfo
=
newlist
->
source_addr
.
in6
.
sin6_flowinfo
=
0
;
#ifdef HAVE_SOCKADDR_SA_LEN
newlist
->
addr
.
in6
.
sin6_len
=
newlist
->
source_addr
.
in6
.
sin6_len
=
sizeof
(
newlist
->
addr
.
in6
);
#endif
if
(
source
)
{
newlist
->
flags
|=
SERV_HAS_SOURCE
;
if
(
inet_pton
(
AF_INET6
,
source
,
&
newlist
->
source_addr
.
in6
.
sin6_addr
)
==
0
)
{
#if defined(SO_BINDTODEVICE)
newlist
->
source_addr
.
in6
.
sin6_addr
=
in6addr_any
;
strncpy
(
newlist
->
interface
,
source
,
IF_NAMESIZE
-
1
);
#else
ret_err
(
_
(
"interface binding not supported"
));
#endif
}
}
else
newlist
->
source_addr
.
in6
.
sin6_addr
=
in6addr_any
;
}
#endif
else
ret_err
(
gen_err
);
char
*
err
=
parse_server
(
arg
,
&
newlist
->
addr
,
&
newlist
->
source_addr
,
newlist
->
interface
,
&
newlist
->
flags
);
if
(
err
)
ret_err
(
err
);
}
serv
=
newlist
;
...
...
@@ -1846,6 +1858,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
serv
->
next
->
flags
=
serv
->
flags
;
serv
->
next
->
addr
=
serv
->
addr
;
serv
->
next
->
source_addr
=
serv
->
source_addr
;
strcpy
(
serv
->
next
->
interface
,
serv
->
interface
);
serv
=
serv
->
next
;
}
serv
->
next
=
daemon
->
servers
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment