2015-11-17 16:53:21 +03:00
/*
* builtin - config . c
*
* Copyright ( C ) 2015 , Taeung Song < treeze . taeung @ gmail . com >
*
*/
# include "builtin.h"
# include "perf.h"
# include "util/cache.h"
2015-12-15 18:39:39 +03:00
# include <subcmd/parse-options.h>
2015-11-17 16:53:21 +03:00
# include "util/util.h"
# include "util/debug.h"
2016-04-14 10:53:19 +03:00
# include "util/config.h"
2015-11-17 16:53:21 +03:00
2016-02-10 20:51:17 +03:00
static bool use_system_config , use_user_config ;
2015-11-17 16:53:21 +03:00
static const char * const config_usage [ ] = {
2016-02-10 20:51:17 +03:00
" perf config [<file-option>] [options] " ,
2015-11-17 16:53:21 +03:00
NULL
} ;
enum actions {
ACTION_LIST = 1
} actions ;
static struct option config_options [ ] = {
OPT_SET_UINT ( ' l ' , " list " , & actions ,
" show current config variables " , ACTION_LIST ) ,
2016-02-10 20:51:17 +03:00
OPT_BOOLEAN ( 0 , " system " , & use_system_config , " use system config file " ) ,
OPT_BOOLEAN ( 0 , " user " , & use_user_config , " use user config file " ) ,
2015-11-17 16:53:21 +03:00
OPT_END ( )
} ;
2016-04-14 10:53:19 +03:00
static int show_config ( struct perf_config_set * set )
2015-11-17 16:53:21 +03:00
{
2016-04-14 10:53:19 +03:00
struct perf_config_section * section ;
struct perf_config_item * item ;
struct list_head * sections ;
if ( set = = NULL )
return - 1 ;
sections = & set - > sections ;
if ( list_empty ( sections ) )
return - 1 ;
list_for_each_entry ( section , sections , node ) {
list_for_each_entry ( item , & section - > items , node ) {
char * value = item - > value ;
if ( value )
printf ( " %s.%s=%s \n " , section - > name ,
item - > name , value ) ;
}
}
2015-11-17 16:53:21 +03:00
return 0 ;
}
int cmd_config ( int argc , const char * * argv , const char * prefix __maybe_unused )
{
int ret = 0 ;
2016-04-14 10:53:19 +03:00
struct perf_config_set * set ;
2016-02-10 20:51:17 +03:00
char * user_config = mkpath ( " %s/.perfconfig " , getenv ( " HOME " ) ) ;
2015-11-17 16:53:21 +03:00
argc = parse_options ( argc , argv , config_options , config_usage ,
PARSE_OPT_STOP_AT_NON_OPTION ) ;
2016-02-10 20:51:17 +03:00
if ( use_system_config & & use_user_config ) {
pr_err ( " Error: only one config file at a time \n " ) ;
parse_options_usage ( config_usage , config_options , " user " , 0 ) ;
parse_options_usage ( NULL , config_options , " system " , 0 ) ;
return - 1 ;
}
if ( use_system_config )
config_exclusive_filename = perf_etc_perfconfig ( ) ;
else if ( use_user_config )
config_exclusive_filename = user_config ;
2016-06-23 17:14:31 +03:00
/*
* At only ' config ' sub - command , individually use the config set
* because of reinitializing with options config file location .
*/
2016-04-14 10:53:19 +03:00
set = perf_config_set__new ( ) ;
if ( ! set ) {
ret = - 1 ;
goto out_err ;
}
2015-11-17 16:53:21 +03:00
switch ( actions ) {
case ACTION_LIST :
if ( argc ) {
pr_err ( " Error: takes no arguments \n " ) ;
parse_options_usage ( config_usage , config_options , " l " , 1 ) ;
} else {
2016-04-14 10:53:19 +03:00
ret = show_config ( set ) ;
2016-02-10 20:51:17 +03:00
if ( ret < 0 ) {
const char * config_filename = config_exclusive_filename ;
if ( ! config_exclusive_filename )
config_filename = user_config ;
2015-11-17 16:53:21 +03:00
pr_err ( " Nothing configured, "
2016-02-10 20:51:17 +03:00
" please check your %s \n " , config_filename ) ;
}
2015-11-17 16:53:21 +03:00
}
break ;
default :
usage_with_options ( config_usage , config_options ) ;
}
2016-04-14 10:53:19 +03:00
perf_config_set__delete ( set ) ;
out_err :
2015-11-17 16:53:21 +03:00
return ret ;
}