/*
Copyright 2008 Nathan Phillip Brink, Ethan Zonca
This file is a part of DistRen.
DistRen is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DistRen 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with DistRen. If not, see .
*/
/* The purpose of this file is to... */
#include "options.h"
#include
#include
#include
#include
struct options_common_data
{
cfg_t *cfg;
};
int options_init(int argc, char *argv[], cfg_t **mycfg, cfg_opt_t *myopts, char *myname, struct options_common **allopts)
{
char *configfile;
size_t i;
/* For those of you who don't know, the following is an example of concatenation of constant strings by the C compiler. Now, that doesn't mean you can do run-time string concatenation ;-)
strdup is because someday configfile will be customizable via argv[]
*/
i = strlen(SYSCONFDIR "/distren.conf") + strlen(myname) + 1;
configfile = malloc(i);
if(!configfile)
{
perror("malloc");
return 1;
}
strncpy(configfile, SYSCONFDIR "/distren", strlen(SYSCONFDIR "/distren") + 1);
strcat(configfile, myname);
strcat(configfile, ".conf");
*allopts = malloc(sizeof(struct options_common));
if(!*allopts)
{
perror("malloc");
free(configfile);
return 1;
}
memset(*allopts, '\0', sizeof(struct options_common));
(*allopts)->data = malloc(sizeof(struct options_common_data));
if(!(*allopts)->data)
{
perror("malloc");
free(configfile);
free(*allopts);
return 1;
}
memset((*allopts)->data, '\0', sizeof(struct options_common_data));
/* Conf File Parser */
cfg_opt_t common_opts[] =
{
CFG_END()
};
/*
In these arrays, I should replace NULL with a pointer to a string in the struct which should hold the result of confuse processing an option. This is partially because confuse will not free the values it parses.
*/
cfg_opt_t server_opts[] =
{
CFG_STR("username", NULL, CFGF_NONE),
CFG_STR("hostname", NULL, CFGF_NONE),
CFG_STR("method", "ssh", CFGF_NONE),
CFG_STR_LIST("types", NULL, CFGF_NONE),
CFG_END()
};
cfg_opt_t opts[] =
{
CFG_SEC("common",
common_opts,
CFGF_NONE),
CFG_SEC("server",
server_opts,
CFGF_MULTI | CFGF_TITLE),
CFG_SEC(myname,
myopts,
0),
CFG_END()
};
(*allopts)->data->cfg = cfg_init(opts, 0);
switch(cfg_parse((*allopts)->data->cfg, configfile))
{
default:
fprintf(stderr, "cfg_parse returned an unknown error code\n");
case CFG_FILE_ERROR:
cfg_error((*allopts)->data->cfg, "Couldn't open file ``%s''\n", configfile);
/* no break; on purpose */
case CFG_PARSE_ERROR:
free((*allopts)->data);
free(*allopts);
free(configfile);
return 1;
case CFG_SUCCESS:
break;
}
free(configfile);
return 0;
}
int options_free(struct options_common *opts)
{
/* free the other common_options struct's members */
cfg_free(opts->data->cfg);
free(opts->data);
free(opts);
return 0;
}