#include "bbsconfig.h"
int config_default()
{
#ifdef CONFIG_TODO
g_config.todo_dir = CONFIG_TODO_DEFAULT_FILE;
#endif
//g_config.todo_files = llist_new();
g_config.todo_files = NULL;
#ifdef CONFIG_ARTICLES
g_config.article_dir = CONFIG_ARTICLES_DEFAULT_DIR;
#else
g_config.article_dir = NULL;
#endif
#ifdef CONFIG_LOGIN
g_config.user_dir = CONFIG_USER_DEFAULT_DIR;
#else
g_config.user_dir = NULL;
#endif
g_config.root_dir = "./";
g_config.syslog = 0;
g_config.debug = 0;
return 0;
}
/*
bbs config file
[bbs]
rootdir string
tododir string
articledir string
userdir string
syslog int
*/
/*
bbs_cfg_handler - callback for parsing ini file and obtain values
*/
static int bbs_cfg_handler( void *user, const char *section, const char *name,
const char *value )
{
bbs_config *cfg = (bbs_config *)user;
#define MATCH(s,n) strcmp(section,s) == 0 && strcmp(name,n)==0
if ( MATCH("bbs","rootdir") )
{
cfg->root_dir = strdup( value );
} else if ( MATCH("bbs","tododir") )
{
cfg->todo_dir = strdup( value );
} else if ( MATCH("bbs","articledir") )
{
cfg->article_dir = strdup( value );
} else if ( MATCH("bbs","userdir") )
{
cfg->user_dir = strdup( value );
} else if ( MATCH("bbs","syslog") )
{
cfg->syslog = atoi( value )&0x01;
}
#undef MATCH
return 1;
}
int config_from_ini( const char *config_file )
{
int ret=-1;
bbs_config cfg;
memset( (void *)&cfg, 0, sizeof(bbs_config));
ASSERT(config_file != NULL);
//check patch if file excists
if ( access(config_file, R_OK) < 0 )
{
printf("Cannot open ini config file: %s\n", strerror(errno));
ret = -1;
return ret;
}
//parse config file
if ( ini_parse( config_file, bbs_cfg_handler, &cfg ) < 0 )
{
printf("Cannot parse config file\n");
ret = -1;
}
g_config = cfg;
return ret;
}
int config_from_argv( int argc, char **argv )
{
int ret=-1;
int c=0;
int iflag=0;
char *ini_file_dir=NULL;
while ( (c = getopt(argc, argv, "a:i:r:u:st:")) != -1 )
{
switch (c)
{
case 'a':
g_config.article_dir = optarg;
break;
case 'i':
iflag = 1;
ini_file_dir = optarg;
break;
case 'r':
g_config.root_dir = optarg;
break;
case 'u':
g_config.user_dir = optarg;
break;
case 's':
g_config.syslog = 1;
break;
case 't':
g_config.todo_dir = optarg;
break;
case '?':
if (( optopt == 'a') || (optopt == 'i') || (optopt == 'r') ||
(optopt == 'u') || (optopt == 't'))
printf("Option -%c requires argument\n", optopt );
else if( isprint(c) )
printf("Unknown option -%c\n", optopt);
else
printf("Unknown option character\n");
break;
default:
printf("Unknown option\n");
ret = -1;
}
}
if ( iflag == 1)
{
config_from_ini( ini_file_dir );
}
return ret;
}
char* config_to_str( size_t max_size )
{
char *str = malloc( max_size );
if (str == NULL)
return NULL;
return str;
}