2014-08-01 16:04:12 +02:00
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
/***
This file is part of systemd .
Copyright 2014 Tom Gundersen < teg @ jklm . no >
systemd is free software ; you can redistribute it and / or modify it
under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation ; either version 2.1 of the License , or
( at your option ) any later version .
systemd is distributed in the hope that it will be useful , but
WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
Lesser General Public License for more details .
You should have received a copy of the GNU Lesser General Public License
along with systemd ; If not , see < http : //www.gnu.org/licenses/>.
* * */
2015-10-27 03:01:06 +01:00
# include "alloc-util.h"
2014-08-01 16:04:12 +02:00
# include "conf-parser.h"
2015-11-03 12:26:12 +01:00
# include "def.h"
2015-10-27 03:01:06 +01:00
# include "extract-word.h"
2015-10-26 16:18:16 +01:00
# include "parse-util.h"
2014-08-01 16:04:12 +02:00
# include "resolved-conf.h"
2015-10-26 16:18:16 +01:00
# include "string-util.h"
2014-08-01 16:04:12 +02:00
int manager_parse_dns_server ( Manager * m , DnsServerType type , const char * string ) {
DnsServer * first ;
int r ;
assert ( m ) ;
assert ( string ) ;
first = type = = DNS_SERVER_FALLBACK ? m - > fallback_dns_servers : m - > dns_servers ;
2015-10-27 09:24:23 +05:30
for ( ; ; ) {
2015-10-27 03:01:06 +01:00
_cleanup_free_ char * word = NULL ;
2014-08-01 16:04:12 +02:00
union in_addr_union addr ;
bool found = false ;
DnsServer * s ;
2015-10-27 09:24:23 +05:30
int family ;
r = extract_first_word ( & string , & word , NULL , 0 ) ;
if ( r < 0 )
return log_error_errno ( r , " Failed to parse resolved dns server syntax \" %s \" : %m " , string ) ;
if ( r = = 0 )
break ;
2014-08-01 16:04:12 +02:00
2015-10-27 09:24:23 +05:30
r = in_addr_from_string_auto ( word , & family , & addr ) ;
2014-08-01 16:04:12 +02:00
if ( r < 0 ) {
2015-10-27 09:24:23 +05:30
log_warning ( " Ignoring invalid DNS address '%s' " , word ) ;
2014-08-01 16:04:12 +02:00
continue ;
}
/* Filter out duplicates */
LIST_FOREACH ( servers , s , first )
if ( s - > family = = family & & in_addr_equal ( family , & s - > address , & addr ) ) {
found = true ;
break ;
}
if ( found )
continue ;
r = dns_server_new ( m , NULL , type , NULL , family , & addr ) ;
if ( r < 0 )
return r ;
}
return 0 ;
}
int config_parse_dnsv (
const char * unit ,
const char * filename ,
unsigned line ,
const char * section ,
unsigned section_line ,
const char * lvalue ,
int ltype ,
const char * rvalue ,
void * data ,
void * userdata ) {
Manager * m = userdata ;
int r ;
assert ( filename ) ;
assert ( lvalue ) ;
assert ( rvalue ) ;
assert ( m ) ;
2014-08-12 19:32:55 +02:00
if ( isempty ( rvalue ) )
2014-08-01 17:03:28 +02:00
/* Empty assignment means clear the list */
2014-08-12 19:32:55 +02:00
manager_flush_dns_servers ( m , ltype ) ;
else {
2014-08-03 07:11:12 +02:00
/* Otherwise, add to the list */
2014-08-01 17:03:28 +02:00
r = manager_parse_dns_server ( m , ltype , rvalue ) ;
if ( r < 0 ) {
2015-09-30 18:22:42 +02:00
log_syntax ( unit , LOG_ERR , filename , line , r , " Failed to parse DNS server string '%s'. Ignoring. " , rvalue ) ;
2014-08-01 17:03:28 +02:00
return 0 ;
}
2014-08-01 16:04:12 +02:00
}
2014-08-01 17:03:28 +02:00
/* If we have a manual setting, then we stop reading
* / etc / resolv . conf */
if ( ltype = = DNS_SERVER_SYSTEM )
m - > read_resolv_conf = false ;
2014-08-01 16:04:12 +02:00
return 0 ;
}
int config_parse_support (
const char * unit ,
const char * filename ,
unsigned line ,
const char * section ,
unsigned section_line ,
const char * lvalue ,
int ltype ,
const char * rvalue ,
void * data ,
void * userdata ) {
Support support , * v = data ;
int r ;
assert ( filename ) ;
assert ( lvalue ) ;
assert ( rvalue ) ;
support = support_from_string ( rvalue ) ;
if ( support < 0 ) {
r = parse_boolean ( rvalue ) ;
if ( r < 0 ) {
2015-09-30 18:22:42 +02:00
log_syntax ( unit , LOG_ERR , filename , line , r , " Failed to parse support level '%s'. Ignoring. " , rvalue ) ;
2014-08-01 16:04:12 +02:00
return 0 ;
}
support = r ? SUPPORT_YES : SUPPORT_NO ;
}
* v = support ;
return 0 ;
}
int manager_parse_config_file ( Manager * m ) {
assert ( m ) ;
2015-11-10 15:57:21 +01:00
return config_parse_many ( PKGSYSCONFDIR " /resolved.conf " ,
CONF_PATHS_NULSTR ( " systemd/resolved.conf.d " ) ,
2014-11-29 01:07:11 -08:00
" Resolve \0 " ,
config_item_perf_lookup , resolved_gperf_lookup ,
false , m ) ;
2014-08-01 16:04:12 +02:00
}