2013-10-28 23:59:56 +04:00
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
/***
This file is part of systemd .
Copyright ( C ) 2013 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/>.
* * */
# include <netinet/ether.h>
# include <net/if.h>
2013-11-02 05:13:48 +04:00
# include "net-util.h"
# include "log.h"
2013-10-28 23:59:56 +04:00
# include "utf8.h"
2013-10-29 18:59:45 +04:00
# include "util.h"
2013-10-28 23:59:56 +04:00
# include "conf-parser.h"
2013-11-02 05:13:48 +04:00
bool net_match_config ( const struct ether_addr * match_mac ,
const char * match_path ,
const char * match_driver ,
const char * match_type ,
const char * match_name ,
2013-11-05 04:35:26 +04:00
const char * dev_mac ,
const char * dev_path ,
const char * dev_driver ,
const char * dev_type ,
const char * dev_name ) {
2013-11-02 05:13:48 +04:00
if ( match_mac ) {
2013-11-05 04:35:26 +04:00
if ( ! dev_mac | | memcmp ( match_mac , ether_aton ( dev_mac ) , ETH_ALEN ) ) {
2013-11-02 05:13:48 +04:00
log_debug ( " Interface MAC address (%s) did not match MACAddress=%s " ,
2013-11-05 04:35:26 +04:00
dev_mac , ether_ntoa ( match_mac ) ) ;
2013-11-02 05:13:48 +04:00
return 0 ;
}
}
if ( match_path ) {
2013-11-05 04:35:26 +04:00
if ( ! streq_ptr ( match_path , dev_path ) ) {
2013-11-02 05:13:48 +04:00
log_debug ( " Interface persistent path (%s) did not match Path=%s " ,
2013-11-05 04:35:26 +04:00
dev_path , match_path ) ;
2013-11-02 05:13:48 +04:00
return 0 ;
}
}
if ( match_driver ) {
2013-11-05 04:35:26 +04:00
if ( ! streq_ptr ( match_driver , dev_driver ) ) {
2013-11-02 05:13:48 +04:00
log_debug ( " Interface device driver (%s) did not match Driver=%s " ,
2013-11-05 04:35:26 +04:00
dev_driver , match_driver ) ;
2013-11-02 05:13:48 +04:00
return 0 ;
}
}
2013-10-28 23:59:56 +04:00
2013-11-02 05:13:48 +04:00
if ( match_type ) {
2013-11-05 04:35:26 +04:00
if ( ! streq_ptr ( match_type , dev_type ) ) {
2013-11-02 05:13:48 +04:00
log_debug ( " Interface type (%s) did not match Type=%s " ,
2013-11-05 04:35:26 +04:00
dev_type , match_type ) ;
2013-11-02 05:13:48 +04:00
return 0 ;
}
}
2013-10-28 23:59:56 +04:00
2013-11-02 05:13:48 +04:00
if ( match_name ) {
2013-11-05 04:35:26 +04:00
if ( ! streq_ptr ( match_name , dev_name ) ) {
2013-11-02 05:13:48 +04:00
log_debug ( " Interface name (%s) did not match Name=%s " ,
2013-11-05 04:35:26 +04:00
dev_name , match_name ) ;
2013-11-02 05:13:48 +04:00
return 0 ;
}
}
2013-10-28 23:59:56 +04:00
2013-11-02 05:13:48 +04:00
return 1 ;
}
2013-10-28 23:59:56 +04:00
int config_parse_ifname ( const char * unit ,
const char * filename ,
unsigned line ,
const char * section ,
const char * lvalue ,
int ltype ,
const char * rvalue ,
void * data ,
void * userdata ) {
char * * s = data ;
char * n ;
assert ( filename ) ;
assert ( lvalue ) ;
assert ( rvalue ) ;
assert ( data ) ;
n = strdup ( rvalue ) ;
if ( ! n )
return log_oom ( ) ;
if ( ! ascii_is_valid ( n ) | | strlen ( n ) > = IFNAMSIZ ) {
log_syntax ( unit , LOG_ERR , filename , line , EINVAL ,
" Interface name is not ASCII clean or is too long, ignoring assignment: %s " , rvalue ) ;
free ( n ) ;
return 0 ;
}
free ( * s ) ;
if ( * n )
* s = n ;
else {
free ( n ) ;
* s = NULL ;
}
return 0 ;
}
int config_parse_hwaddr ( const char * unit ,
const char * filename ,
unsigned line ,
const char * section ,
const char * lvalue ,
int ltype ,
const char * rvalue ,
void * data ,
void * userdata ) {
struct ether_addr * * hwaddr = data ;
struct ether_addr * n ;
int r ;
assert ( filename ) ;
assert ( lvalue ) ;
assert ( rvalue ) ;
assert ( data ) ;
2013-10-29 18:59:45 +04:00
n = new0 ( struct ether_addr , 1 ) ;
2013-10-28 23:59:56 +04:00
if ( ! n )
return log_oom ( ) ;
r = sscanf ( rvalue , " %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx " ,
& n - > ether_addr_octet [ 0 ] ,
& n - > ether_addr_octet [ 1 ] ,
& n - > ether_addr_octet [ 2 ] ,
& n - > ether_addr_octet [ 3 ] ,
& n - > ether_addr_octet [ 4 ] ,
& n - > ether_addr_octet [ 5 ] ) ;
if ( r ! = 6 ) {
log_syntax ( unit , LOG_ERR , filename , line , EINVAL ,
" Not a valid MAC address, ignoring assignment: %s " , rvalue ) ;
free ( n ) ;
return 0 ;
}
free ( * hwaddr ) ;
* hwaddr = n ;
return 0 ;
}