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
d68c2ca2
Commit
d68c2ca2
authored
Feb 18, 2014
by
Simon Kelley
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Cleanup of server reading code, preparation, for dynamic reading from files.
parent
de73a497
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
145 additions
and
176 deletions
+145
-176
src/dbus.c
src/dbus.c
+17
-115
src/dnsmasq.h
src/dnsmasq.h
+7
-0
src/network.c
src/network.c
+114
-61
src/option.c
src/option.c
+7
-0
No files found.
src/dbus.c
View file @
d68c2ca2
...
@@ -108,108 +108,6 @@ static void remove_watch(DBusWatch *watch, void *data)
...
@@ -108,108 +108,6 @@ static void remove_watch(DBusWatch *watch, void *data)
w
=
data
;
/* no warning */
w
=
data
;
/* no warning */
}
}
static
void
add_update_server
(
union
mysockaddr
*
addr
,
union
mysockaddr
*
source_addr
,
const
char
*
interface
,
const
char
*
domain
)
{
struct
server
*
serv
;
/* See if there is a suitable candidate, and unmark */
for
(
serv
=
daemon
->
servers
;
serv
;
serv
=
serv
->
next
)
if
((
serv
->
flags
&
SERV_FROM_DBUS
)
&&
(
serv
->
flags
&
SERV_MARK
))
{
if
(
domain
)
{
if
(
!
(
serv
->
flags
&
SERV_HAS_DOMAIN
)
||
!
hostname_isequal
(
domain
,
serv
->
domain
))
continue
;
}
else
{
if
(
serv
->
flags
&
SERV_HAS_DOMAIN
)
continue
;
}
serv
->
flags
&=
~
SERV_MARK
;
break
;
}
if
(
!
serv
&&
(
serv
=
whine_malloc
(
sizeof
(
struct
server
))))
{
/* Not found, create a new one. */
memset
(
serv
,
0
,
sizeof
(
struct
server
));
if
(
domain
&&
!
(
serv
->
domain
=
whine_malloc
(
strlen
(
domain
)
+
1
)))
{
free
(
serv
);
serv
=
NULL
;
}
else
{
serv
->
next
=
daemon
->
servers
;
daemon
->
servers
=
serv
;
serv
->
flags
=
SERV_FROM_DBUS
;
if
(
domain
)
{
strcpy
(
serv
->
domain
,
domain
);
serv
->
flags
|=
SERV_HAS_DOMAIN
;
}
}
}
if
(
serv
)
{
if
(
interface
)
strcpy
(
serv
->
interface
,
interface
);
else
serv
->
interface
[
0
]
=
0
;
if
(
source_addr
->
in
.
sin_family
==
AF_INET
&&
addr
->
in
.
sin_addr
.
s_addr
==
0
&&
serv
->
domain
)
serv
->
flags
|=
SERV_NO_ADDR
;
else
{
serv
->
flags
&=
~
SERV_NO_ADDR
;
serv
->
addr
=
*
addr
;
serv
->
source_addr
=
*
source_addr
;
}
}
}
static
void
mark_dbus
(
void
)
{
struct
server
*
serv
;
/* mark everything from DBUS */
for
(
serv
=
daemon
->
servers
;
serv
;
serv
=
serv
->
next
)
if
(
serv
->
flags
&
SERV_FROM_DBUS
)
serv
->
flags
|=
SERV_MARK
;
}
static
void
cleanup_dbus
()
{
struct
server
*
serv
,
*
tmp
,
**
up
;
/* unlink and free anything still marked. */
for
(
serv
=
daemon
->
servers
,
up
=
&
daemon
->
servers
;
serv
;
serv
=
tmp
)
{
tmp
=
serv
->
next
;
if
(
serv
->
flags
&
SERV_MARK
)
{
server_gone
(
serv
);
*
up
=
serv
->
next
;
if
(
serv
->
domain
)
free
(
serv
->
domain
);
free
(
serv
);
}
else
up
=
&
serv
->
next
;
}
}
static
void
dbus_read_servers
(
DBusMessage
*
message
)
static
void
dbus_read_servers
(
DBusMessage
*
message
)
{
{
DBusMessageIter
iter
;
DBusMessageIter
iter
;
...
@@ -218,8 +116,8 @@ static void dbus_read_servers(DBusMessage *message)
...
@@ -218,8 +116,8 @@ static void dbus_read_servers(DBusMessage *message)
dbus_message_iter_init
(
message
,
&
iter
);
dbus_message_iter_init
(
message
,
&
iter
);
mark_
dbus
(
);
mark_
servers
(
SERV_FROM_DBUS
);
while
(
1
)
while
(
1
)
{
{
int
skip
=
0
;
int
skip
=
0
;
...
@@ -289,13 +187,13 @@ static void dbus_read_servers(DBusMessage *message)
...
@@ -289,13 +187,13 @@ static void dbus_read_servers(DBusMessage *message)
domain
=
NULL
;
domain
=
NULL
;
if
(
!
skip
)
if
(
!
skip
)
add_update_server
(
&
addr
,
&
source_addr
,
NULL
,
domain
);
add_update_server
(
SERV_FROM_DBUS
,
&
addr
,
&
source_addr
,
NULL
,
domain
);
}
while
(
dbus_message_iter_get_arg_type
(
&
iter
)
==
DBUS_TYPE_STRING
);
}
while
(
dbus_message_iter_get_arg_type
(
&
iter
)
==
DBUS_TYPE_STRING
);
}
}
/* unlink and free anything still marked. */
/* unlink and free anything still marked. */
cleanup_
dbu
s
();
cleanup_
server
s
();
}
}
static
DBusMessage
*
dbus_read_servers_ex
(
DBusMessage
*
message
,
int
strings
)
static
DBusMessage
*
dbus_read_servers_ex
(
DBusMessage
*
message
,
int
strings
)
...
@@ -319,7 +217,7 @@ static DBusMessage* dbus_read_servers_ex(DBusMessage *message, int strings)
...
@@ -319,7 +217,7 @@ static DBusMessage* dbus_read_servers_ex(DBusMessage *message, int strings)
strings
?
"Expected array of string"
:
"Expected array of string arrays"
);
strings
?
"Expected array of string"
:
"Expected array of string arrays"
);
}
}
mark_
dbus
(
);
mark_
servers
(
SERV_FROM_DBUS
);
/* array_iter points to each "as" element in the outer array */
/* array_iter points to each "as" element in the outer array */
dbus_message_iter_recurse
(
&
iter
,
&
array_iter
);
dbus_message_iter_recurse
(
&
iter
,
&
array_iter
);
...
@@ -327,6 +225,7 @@ static DBusMessage* dbus_read_servers_ex(DBusMessage *message, int strings)
...
@@ -327,6 +225,7 @@ static DBusMessage* dbus_read_servers_ex(DBusMessage *message, int strings)
{
{
const
char
*
str
=
NULL
;
const
char
*
str
=
NULL
;
union
mysockaddr
addr
,
source_addr
;
union
mysockaddr
addr
,
source_addr
;
int
flags
;
char
interface
[
IF_NAMESIZE
];
char
interface
[
IF_NAMESIZE
];
char
*
str_addr
,
*
str_domain
=
NULL
;
char
*
str_addr
,
*
str_domain
=
NULL
;
...
@@ -416,16 +315,19 @@ static DBusMessage* dbus_read_servers_ex(DBusMessage *message, int strings)
...
@@ -416,16 +315,19 @@ static DBusMessage* dbus_read_servers_ex(DBusMessage *message, int strings)
memset
(
&
interface
,
0
,
sizeof
(
interface
));
memset
(
&
interface
,
0
,
sizeof
(
interface
));
/* parse the IP address */
/* parse the IP address */
addr_err
=
parse_server
(
str_addr
,
&
addr
,
&
source_addr
,
(
char
*
)
&
interface
,
NULL
);
if
((
addr_err
=
parse_server
(
str_addr
,
&
addr
,
&
source_addr
,
(
char
*
)
&
interface
,
&
flags
)))
{
if
(
addr_err
)
{
error
=
dbus_message_new_error_printf
(
message
,
DBUS_ERROR_INVALID_ARGS
,
error
=
dbus_message_new_error_printf
(
message
,
DBUS_ERROR_INVALID_ARGS
,
"Invalid IP address '%s': %s"
,
"Invalid IP address '%s': %s"
,
str
,
addr_err
);
str
,
addr_err
);
break
;
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_NO_ADDR
;
if
(
strings
)
if
(
strings
)
{
{
char
*
p
;
char
*
p
;
...
@@ -439,7 +341,7 @@ static DBusMessage* dbus_read_servers_ex(DBusMessage *message, int strings)
...
@@ -439,7 +341,7 @@ static DBusMessage* dbus_read_servers_ex(DBusMessage *message, int strings)
else
else
p
=
NULL
;
p
=
NULL
;
add_update_server
(
&
addr
,
&
source_addr
,
interface
,
str_domain
);
add_update_server
(
flags
|
SERV_FROM_DBUS
,
&
addr
,
&
source_addr
,
interface
,
str_domain
);
}
while
((
str_domain
=
p
));
}
while
((
str_domain
=
p
));
}
}
else
else
...
@@ -454,7 +356,7 @@ static DBusMessage* dbus_read_servers_ex(DBusMessage *message, int strings)
...
@@ -454,7 +356,7 @@ static DBusMessage* dbus_read_servers_ex(DBusMessage *message, int strings)
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
);
add_update_server
(
&
addr
,
&
source_addr
,
interface
,
str
);
add_update_server
(
flags
|
SERV_FROM_DBUS
,
&
addr
,
&
source_addr
,
interface
,
str
);
}
while
(
dbus_message_iter_get_arg_type
(
&
string_iter
)
==
DBUS_TYPE_STRING
);
}
while
(
dbus_message_iter_get_arg_type
(
&
string_iter
)
==
DBUS_TYPE_STRING
);
}
}
...
@@ -462,7 +364,7 @@ static DBusMessage* dbus_read_servers_ex(DBusMessage *message, int strings)
...
@@ -462,7 +364,7 @@ static DBusMessage* dbus_read_servers_ex(DBusMessage *message, int strings)
dbus_message_iter_next
(
&
array_iter
);
dbus_message_iter_next
(
&
array_iter
);
}
}
cleanup_
dbu
s
();
cleanup_
server
s
();
if
(
dup
)
if
(
dup
)
free
(
dup
);
free
(
dup
);
...
...
src/dnsmasq.h
View file @
d68c2ca2
...
@@ -1153,6 +1153,13 @@ int local_bind(int fd, union mysockaddr *addr, char *intname, int is_tcp);
...
@@ -1153,6 +1153,13 @@ int local_bind(int fd, union mysockaddr *addr, char *intname, int is_tcp);
int
random_sock
(
int
family
);
int
random_sock
(
int
family
);
void
pre_allocate_sfds
(
void
);
void
pre_allocate_sfds
(
void
);
int
reload_servers
(
char
*
fname
);
int
reload_servers
(
char
*
fname
);
void
mark_servers
(
int
flag
);
void
cleanup_servers
(
void
);
void
add_update_server
(
int
flags
,
union
mysockaddr
*
addr
,
union
mysockaddr
*
source_addr
,
const
char
*
interface
,
const
char
*
domain
);
void
check_servers
(
void
);
void
check_servers
(
void
);
int
enumerate_interfaces
(
int
reset
);
int
enumerate_interfaces
(
int
reset
);
void
create_wildcard_listeners
(
void
);
void
create_wildcard_listeners
(
void
);
...
...
src/network.c
View file @
d68c2ca2
...
@@ -1254,18 +1254,120 @@ void pre_allocate_sfds(void)
...
@@ -1254,18 +1254,120 @@ void pre_allocate_sfds(void)
}
}
}
}
void
mark_servers
(
int
flag
)
{
struct
server
*
serv
;
/* mark everything with argument flag */
for
(
serv
=
daemon
->
servers
;
serv
;
serv
=
serv
->
next
)
if
(
serv
->
flags
&
flag
)
serv
->
flags
|=
SERV_MARK
;
}
void
cleanup_servers
(
void
)
{
struct
server
*
serv
,
*
tmp
,
**
up
;
/* unlink and free anything still marked. */
for
(
serv
=
daemon
->
servers
,
up
=
&
daemon
->
servers
;
serv
;
serv
=
tmp
)
{
tmp
=
serv
->
next
;
if
(
serv
->
flags
&
SERV_MARK
)
{
server_gone
(
serv
);
*
up
=
serv
->
next
;
if
(
serv
->
domain
)
free
(
serv
->
domain
);
free
(
serv
);
}
else
up
=
&
serv
->
next
;
}
}
void
add_update_server
(
int
flags
,
union
mysockaddr
*
addr
,
union
mysockaddr
*
source_addr
,
const
char
*
interface
,
const
char
*
domain
)
{
struct
server
*
serv
;
/* See if there is a suitable candidate, and unmark */
for
(
serv
=
daemon
->
servers
;
serv
;
serv
=
serv
->
next
)
if
(
serv
->
flags
&
SERV_MARK
)
{
if
(
domain
)
{
if
(
!
(
serv
->
flags
&
SERV_HAS_DOMAIN
)
||
!
hostname_isequal
(
domain
,
serv
->
domain
))
continue
;
}
else
{
if
(
serv
->
flags
&
SERV_HAS_DOMAIN
)
continue
;
}
serv
->
flags
&=
~
SERV_MARK
;
break
;
}
if
(
!
serv
&&
(
serv
=
whine_malloc
(
sizeof
(
struct
server
))))
{
/* Not found, create a new one. */
memset
(
serv
,
0
,
sizeof
(
struct
server
));
if
(
domain
&&
!
(
serv
->
domain
=
whine_malloc
(
strlen
(
domain
)
+
1
)))
{
free
(
serv
);
serv
=
NULL
;
}
else
{
struct
server
*
s
;
/* Add to the end of the chain, for order */
if
(
!
daemon
->
servers
)
daemon
->
servers
=
serv
;
else
{
for
(
s
=
daemon
->
servers
;
s
->
next
;
s
=
s
->
next
);
s
->
next
=
serv
;
}
if
(
domain
)
strcpy
(
serv
->
domain
,
domain
);
}
}
if
(
serv
)
{
serv
->
flags
=
flags
;
serv
->
queries
=
serv
->
failed_queries
=
0
;
if
(
domain
)
serv
->
flags
|=
SERV_HAS_DOMAIN
;
if
(
interface
)
strcpy
(
serv
->
interface
,
interface
);
else
serv
->
interface
[
0
]
=
0
;
serv
->
addr
=
*
addr
;
serv
->
source_addr
=
*
source_addr
;
}
}
void
check_servers
(
void
)
void
check_servers
(
void
)
{
{
struct
irec
*
iface
;
struct
irec
*
iface
;
struct
server
*
new
,
*
tmp
,
*
ret
=
NULL
;
struct
server
*
new
,
*
tmp
,
*
*
up
;
int
port
=
0
;
int
port
=
0
;
/* interface may be new since startup */
/* interface may be new since startup */
if
(
!
option_bool
(
OPT_NOWILD
))
if
(
!
option_bool
(
OPT_NOWILD
))
enumerate_interfaces
(
0
);
enumerate_interfaces
(
0
);
for
(
new
=
daemon
->
servers
;
new
;
new
=
tmp
)
for
(
up
=
&
daemon
->
servers
,
new
=
daemon
->
servers
;
new
;
new
=
tmp
)
{
{
tmp
=
new
->
next
;
tmp
=
new
->
next
;
...
@@ -1277,6 +1379,7 @@ void check_servers(void)
...
@@ -1277,6 +1379,7 @@ void check_servers(void)
if
(
new
->
addr
.
sa
.
sa_family
==
AF_INET
&&
if
(
new
->
addr
.
sa
.
sa_family
==
AF_INET
&&
new
->
addr
.
in
.
sin_addr
.
s_addr
==
0
)
new
->
addr
.
in
.
sin_addr
.
s_addr
==
0
)
{
{
*
up
=
tmp
;
free
(
new
);
free
(
new
);
continue
;
continue
;
}
}
...
@@ -1287,6 +1390,7 @@ void check_servers(void)
...
@@ -1287,6 +1390,7 @@ void check_servers(void)
if
(
iface
)
if
(
iface
)
{
{
my_syslog
(
LOG_WARNING
,
_
(
"ignoring nameserver %s - local interface"
),
daemon
->
namebuff
);
my_syslog
(
LOG_WARNING
,
_
(
"ignoring nameserver %s - local interface"
),
daemon
->
namebuff
);
*
up
=
tmp
;
free
(
new
);
free
(
new
);
continue
;
continue
;
}
}
...
@@ -1299,15 +1403,12 @@ void check_servers(void)
...
@@ -1299,15 +1403,12 @@ void check_servers(void)
my_syslog
(
LOG_WARNING
,
my_syslog
(
LOG_WARNING
,
_
(
"ignoring nameserver %s - cannot make/bind socket: %s"
),
_
(
"ignoring nameserver %s - cannot make/bind socket: %s"
),
daemon
->
namebuff
,
strerror
(
errno
));
daemon
->
namebuff
,
strerror
(
errno
));
*
up
=
tmp
;
free
(
new
);
free
(
new
);
continue
;
continue
;
}
}
}
}
/* reverse order - gets it right. */
new
->
next
=
ret
;
ret
=
new
;
if
(
!
(
new
->
flags
&
SERV_NO_REBIND
))
if
(
!
(
new
->
flags
&
SERV_NO_REBIND
))
{
{
if
(
new
->
flags
&
(
SERV_HAS_DOMAIN
|
SERV_FOR_NODOTS
|
SERV_USE_RESOLV
))
if
(
new
->
flags
&
(
SERV_HAS_DOMAIN
|
SERV_FOR_NODOTS
|
SERV_USE_RESOLV
))
...
@@ -1332,9 +1433,9 @@ void check_servers(void)
...
@@ -1332,9 +1433,9 @@ void check_servers(void)
else
else
my_syslog
(
LOG_INFO
,
_
(
"using nameserver %s#%d"
),
daemon
->
namebuff
,
port
);
my_syslog
(
LOG_INFO
,
_
(
"using nameserver %s#%d"
),
daemon
->
namebuff
,
port
);
}
}
up
=
&
new
->
next
;
}
}
daemon
->
servers
=
ret
;
}
}
/* Return zero if no servers found, in that case we keep polling.
/* Return zero if no servers found, in that case we keep polling.
...
@@ -1343,9 +1444,6 @@ int reload_servers(char *fname)
...
@@ -1343,9 +1444,6 @@ int reload_servers(char *fname)
{
{
FILE
*
f
;
FILE
*
f
;
char
*
line
;
char
*
line
;
struct
server
*
old_servers
=
NULL
;
struct
server
*
new_servers
=
NULL
;
struct
server
*
serv
;
int
gotone
=
0
;
int
gotone
=
0
;
/* buff happens to be MAXDNAME long... */
/* buff happens to be MAXDNAME long... */
...
@@ -1354,28 +1452,9 @@ int reload_servers(char *fname)
...
@@ -1354,28 +1452,9 @@ int reload_servers(char *fname)
my_syslog
(
LOG_ERR
,
_
(
"failed to read %s: %s"
),
fname
,
strerror
(
errno
));
my_syslog
(
LOG_ERR
,
_
(
"failed to read %s: %s"
),
fname
,
strerror
(
errno
));
return
0
;
return
0
;
}
}
/* move old servers to free list - we can reuse the memory
mark_servers
(
SERV_FROM_RESOLV
);
and not risk malloc if there are the same or fewer new servers.
Servers which were specced on the command line go to the new list. */
for
(
serv
=
daemon
->
servers
;
serv
;)
{
struct
server
*
tmp
=
serv
->
next
;
if
(
serv
->
flags
&
SERV_FROM_RESOLV
)
{
serv
->
next
=
old_servers
;
old_servers
=
serv
;
/* forward table rules reference servers, so have to blow them away */
server_gone
(
serv
);
}
else
{
serv
->
next
=
new_servers
;
new_servers
=
serv
;
}
serv
=
tmp
;
}
while
((
line
=
fgets
(
daemon
->
namebuff
,
MAXDNAME
,
f
)))
while
((
line
=
fgets
(
daemon
->
namebuff
,
MAXDNAME
,
f
)))
{
{
union
mysockaddr
addr
,
source_addr
;
union
mysockaddr
addr
,
source_addr
;
...
@@ -1434,38 +1513,12 @@ int reload_servers(char *fname)
...
@@ -1434,38 +1513,12 @@ int reload_servers(char *fname)
continue
;
continue
;
#endif
#endif
if
(
old_servers
)
add_update_server
(
SERV_FROM_RESOLV
,
&
addr
,
&
source_addr
,
NULL
,
NULL
);
{
serv
=
old_servers
;
old_servers
=
old_servers
->
next
;
}
else
if
(
!
(
serv
=
whine_malloc
(
sizeof
(
struct
server
))))
continue
;
/* this list is reverse ordered:
it gets reversed again in check_servers */
serv
->
next
=
new_servers
;
new_servers
=
serv
;
serv
->
addr
=
addr
;
serv
->
source_addr
=
source_addr
;
serv
->
domain
=
NULL
;
serv
->
interface
[
0
]
=
0
;
serv
->
sfd
=
NULL
;
serv
->
flags
=
SERV_FROM_RESOLV
;
serv
->
queries
=
serv
->
failed_queries
=
0
;
gotone
=
1
;
gotone
=
1
;
}
}
/* Free any memory not used. */
while
(
old_servers
)
{
struct
server
*
tmp
=
old_servers
->
next
;
free
(
old_servers
);
old_servers
=
tmp
;
}
daemon
->
servers
=
new_servers
;
fclose
(
f
);
fclose
(
f
);
cleanup_servers
();
return
gotone
;
return
gotone
;
}
}
...
...
src/option.c
View file @
d68c2ca2
...
@@ -689,6 +689,13 @@ char *parse_server(char *arg, union mysockaddr *addr, union mysockaddr *source_a
...
@@ -689,6 +689,13 @@ char *parse_server(char *arg, union mysockaddr *addr, union mysockaddr *source_a
char
*
scope_id
;
char
*
scope_id
;
#endif
#endif
if
(
!
arg
||
strlen
(
arg
)
==
0
)
{
*
flags
|=
SERV_NO_ADDR
;
*
interface
=
0
;
return
NULL
;
}
if
((
source
=
split_chr
(
arg
,
'@'
))
&&
/* is there a source. */
if
((
source
=
split_chr
(
arg
,
'@'
))
&&
/* is there a source. */
(
portno
=
split_chr
(
source
,
'#'
))
&&
(
portno
=
split_chr
(
source
,
'#'
))
&&
!
atoi_check16
(
portno
,
&
source_port
))
!
atoi_check16
(
portno
,
&
source_port
))
...
...
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