2010-08-17 05:33:07 +04:00
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2009-11-19 02:48:48 +03:00
# ifndef fooconfparserhfoo
# define fooconfparserhfoo
2010-02-03 15:03:47 +03:00
/***
This file is part of systemd .
Copyright 2010 Lennart Poettering
systemd is free software ; you can redistribute it and / or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 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
General Public License for more details .
You should have received a copy of the GNU General Public License
along with systemd ; If not , see < http : //www.gnu.org/licenses/>.
* * */
2009-11-19 02:48:48 +03:00
# include <stdio.h>
2010-06-16 03:58:50 +04:00
# include <stdbool.h>
2009-11-19 02:48:48 +03:00
/* An abstract parser for simple, line based, shallow configuration
* files consisting of variable assignments only . */
2011-03-25 07:07:20 +03:00
typedef int ( * ConfigParserCallback ) ( const char * filename , unsigned line , const char * section , const char * lvalue , int ltype , const char * rvalue , void * data , void * userdata ) ;
2009-11-19 02:48:48 +03:00
/* Wraps info for parsing a specific configuration variable */
typedef struct ConfigItem {
const char * lvalue ; /* name of the variable */
2010-02-01 05:33:24 +03:00
ConfigParserCallback parse ; /* Function that is called to parse the variable's value */
2011-03-25 07:07:20 +03:00
int ltype ; /* Distinguish differnt variables passed to the same callback */
2009-11-19 02:48:48 +03:00
void * data ; /* Where to store the variable's data */
const char * section ;
} ConfigItem ;
/* The configuration file parsing routine. Expects a table of
* config_items in * t that is terminated by an item where lvalue is
* NULL */
2010-06-16 03:58:50 +04:00
int config_parse ( const char * filename , FILE * f , const char * const * sections , const ConfigItem * t , bool relaxed , void * userdata ) ;
2009-11-19 02:48:48 +03:00
/* Generic parsers */
2011-03-25 07:07:20 +03:00
int config_parse_int ( const char * filename , unsigned line , const char * section , const char * lvalue , int ltype , const char * rvalue , void * data , void * userdata ) ;
int config_parse_unsigned ( const char * filename , unsigned line , const char * section , const char * lvalue , int ltype , const char * rvalue , void * data , void * userdata ) ;
int config_parse_uint64 ( const char * filename , unsigned line , const char * section , const char * lvalue , int ltype , const char * rvalue , void * data , void * userdata ) ;
int config_parse_size ( const char * filename , unsigned line , const char * section , const char * lvalue , int ltype , const char * rvalue , void * data , void * userdata ) ;
int config_parse_bool ( const char * filename , unsigned line , const char * section , const char * lvalue , int ltype , const char * rvalue , void * data , void * userdata ) ;
int config_parse_string ( const char * filename , unsigned line , const char * section , const char * lvalue , int ltype , const char * rvalue , void * data , void * userdata ) ;
int config_parse_path ( const char * filename , unsigned line , const char * section , const char * lvalue , int ltype , const char * rvalue , void * data , void * userdata ) ;
int config_parse_strv ( const char * filename , unsigned line , const char * section , const char * lvalue , int ltype , const char * rvalue , void * data , void * userdata ) ;
int config_parse_path_strv ( const char * filename , unsigned line , const char * section , const char * lvalue , int ltype , const char * rvalue , void * data , void * userdata ) ;
2009-11-19 02:48:48 +03:00
2010-07-07 03:10:27 +04:00
# define DEFINE_CONFIG_PARSE_ENUM(function,name,type,msg) \
int function ( \
const char * filename , \
unsigned line , \
const char * section , \
const char * lvalue , \
2011-03-25 07:07:20 +03:00
int ltype , \
2010-07-07 03:10:27 +04:00
const char * rvalue , \
void * data , \
void * userdata ) { \
\
type * i = data , x ; \
\
assert ( filename ) ; \
assert ( lvalue ) ; \
assert ( rvalue ) ; \
assert ( data ) ; \
\
if ( ( x = name # # _from_string ( rvalue ) ) < 0 ) { \
2010-08-17 05:30:53 +04:00
log_error ( " [%s:%u] " msg " , ignoring: %s " , filename , line , rvalue ) ; \
return 0 ; \
2010-07-07 03:10:27 +04:00
} \
\
* i = x ; \
\
return 0 ; \
}
2009-11-19 02:48:48 +03:00
# endif