|
Packit |
c00610 |
#include <stdio.h>
|
|
Packit |
c00610 |
#include <stdlib.h>
|
|
Packit |
c00610 |
#include <string.h>
|
|
Packit |
c00610 |
|
|
Packit |
c00610 |
/* this example does not work for WIN32 */
|
|
Packit |
c00610 |
|
|
Packit |
c00610 |
#ifndef WIN32
|
|
Packit |
c00610 |
#include <dlfcn.h> /* for dlopen(), dlerror(), dlclose() */
|
|
Packit |
c00610 |
#include <unistd.h>
|
|
Packit |
c00610 |
#endif
|
|
Packit |
c00610 |
|
|
Packit |
c00610 |
#include <dotconf.h>
|
|
Packit |
c00610 |
|
|
Packit |
c00610 |
/* define our callbacks; */
|
|
Packit |
c00610 |
/* for definition of DOTCONF_CB see dotconf.h */
|
|
Packit |
c00610 |
|
|
Packit |
c00610 |
static DOTCONF_CB(cb_example);
|
|
Packit |
c00610 |
static DOTCONF_CB(cb_moreargs);
|
|
Packit |
c00610 |
static DOTCONF_CB(cb_addmodule);
|
|
Packit |
c00610 |
static DOTCONF_CB(cb_multiline); /* here document test */
|
|
Packit |
c00610 |
static DOTCONF_CB(cb_unknown); /* fallback for unknwon options */
|
|
Packit |
c00610 |
|
|
Packit |
c00610 |
/* define the Option ExampleOption that expects a string
|
|
Packit |
c00610 |
* and tell the parser to call the function cb_example
|
|
Packit |
c00610 |
*/
|
|
Packit |
c00610 |
static const configoption_t options[] = {
|
|
Packit |
c00610 |
{"ExampleOption", ARG_STR, cb_example, 0, 0},
|
|
Packit |
c00610 |
{"MoreArgs", ARG_LIST, cb_moreargs, 0, 0},
|
|
Packit |
c00610 |
{"AddModule", ARG_STR, cb_addmodule, 0, 0},
|
|
Packit |
c00610 |
{"MultiLineRaw", ARG_STR, cb_multiline, 0, 0},
|
|
Packit |
c00610 |
{"", ARG_NAME, cb_unknown, 0, 0},
|
|
Packit |
c00610 |
LAST_OPTION
|
|
Packit |
c00610 |
};
|
|
Packit |
c00610 |
|
|
Packit |
c00610 |
#define NUM_MODULES 10
|
|
Packit |
c00610 |
static void *handles[NUM_MODULES]; /* handles of dynamically loaded modules */
|
|
Packit |
c00610 |
|
|
Packit |
c00610 |
int main(int argc, char **argv)
|
|
Packit |
c00610 |
{
|
|
Packit |
c00610 |
int i;
|
|
Packit |
c00610 |
configfile_t *configfile;
|
|
Packit |
c00610 |
|
|
Packit |
c00610 |
memset(handles, 0, sizeof(handles));
|
|
Packit |
c00610 |
putenv("TESTUSER=lukas");
|
|
Packit |
c00610 |
|
|
Packit |
c00610 |
/*
|
|
Packit |
c00610 |
* start reading config, CASE_INSENSITIVE (specify NONE or 0 for the
|
|
Packit |
c00610 |
* the default behaviour which matches case sensitive
|
|
Packit |
c00610 |
*/
|
|
Packit |
c00610 |
configfile = dotconf_create(argv[1] ? argv[1] : "sample.conf",
|
|
Packit |
c00610 |
options, 0, CASE_INSENSITIVE);
|
|
Packit |
c00610 |
if (!configfile) {
|
|
Packit |
c00610 |
fprintf(stderr, "Error opening config file\n");
|
|
Packit |
c00610 |
return 1;
|
|
Packit |
c00610 |
}
|
|
Packit |
c00610 |
|
|
Packit |
c00610 |
if (dotconf_command_loop(configfile) == 0)
|
|
Packit |
c00610 |
fprintf(stderr, "Error reading config file\n");
|
|
Packit |
c00610 |
|
|
Packit |
c00610 |
dotconf_cleanup(configfile);
|
|
Packit |
c00610 |
|
|
Packit |
c00610 |
for (i = 0; i < NUM_MODULES && handles[i]; i++)
|
|
Packit |
c00610 |
dlclose(handles[i]);
|
|
Packit |
c00610 |
|
|
Packit |
c00610 |
return 0;
|
|
Packit |
c00610 |
}
|
|
Packit |
c00610 |
|
|
Packit |
c00610 |
/* the error-handler; a new feature of v0.7.0 to filter out messages
|
|
Packit |
c00610 |
issued using config_warning
|
|
Packit |
c00610 |
FUNC_ERRORHANDLER(my_errorhandler)
|
|
Packit |
c00610 |
{
|
|
Packit |
c00610 |
printf("ERROR [type=%d][%d] %s\n", type, dc_errno, msg);
|
|
Packit |
c00610 |
}
|
|
Packit |
c00610 |
*/
|
|
Packit |
c00610 |
|
|
Packit |
c00610 |
/* declare our callback function */
|
|
Packit |
c00610 |
DOTCONF_CB(cb_example)
|
|
Packit |
c00610 |
{
|
|
Packit |
c00610 |
printf("%s:%ld: ExampleOption: [arg=%s]\n", cmd->configfile->filename,
|
|
Packit |
c00610 |
cmd->configfile->line, cmd->data.str);
|
|
Packit |
c00610 |
return NULL;
|
|
Packit |
c00610 |
}
|
|
Packit |
c00610 |
|
|
Packit |
c00610 |
/*
|
|
Packit |
c00610 |
* we dont need the userdata, so dont mention it
|
|
Packit |
c00610 |
* otherwise we should've appended it as argument 3
|
|
Packit |
c00610 |
*/
|
|
Packit |
c00610 |
DOTCONF_CB(cb_moreargs)
|
|
Packit |
c00610 |
{
|
|
Packit |
c00610 |
int i;
|
|
Packit |
c00610 |
for (i = 0; i < cmd->arg_count; i++)
|
|
Packit |
c00610 |
printf("%s:%ld: [MoreArgs] Arg #%d '%s'\n",
|
|
Packit |
c00610 |
cmd->configfile->filename, cmd->configfile->line, i + 1,
|
|
Packit |
c00610 |
cmd->data.list[i]);
|
|
Packit |
c00610 |
return 0;
|
|
Packit |
c00610 |
}
|
|
Packit |
c00610 |
|
|
Packit |
c00610 |
DOTCONF_CB(cb_addmodule)
|
|
Packit |
c00610 |
{
|
|
Packit |
c00610 |
int i;
|
|
Packit |
c00610 |
char filename[128]; /* filename of modules */
|
|
Packit |
c00610 |
|
|
Packit |
c00610 |
for (i = 0; (i < NUM_MODULES) && (handles[i] != 0); i++) ;
|
|
Packit |
c00610 |
|
|
Packit |
c00610 |
snprintf(filename, 128, "./%s.so", cmd->data.str);
|
|
Packit |
c00610 |
|
|
Packit |
c00610 |
if (!access(filename, R_OK)) { /* if file access is permitted */
|
|
Packit |
c00610 |
/* load library */
|
|
Packit |
c00610 |
handles[i] = dlopen(filename, RTLD_LAZY);
|
|
Packit |
c00610 |
if (!handles[i])
|
|
Packit |
c00610 |
printf("Error opening library: %s\n", dlerror());
|
|
Packit |
c00610 |
dotconf_register_options(cmd->configfile,
|
|
Packit |
c00610 |
dlsym(handles[i], "new_options"));
|
|
Packit |
c00610 |
}
|
|
Packit |
c00610 |
printf("Module %s successfully loaded\n", cmd->data.str);
|
|
Packit |
c00610 |
return NULL;
|
|
Packit |
c00610 |
}
|
|
Packit |
c00610 |
|
|
Packit |
c00610 |
DOTCONF_CB(cb_multiline)
|
|
Packit |
c00610 |
{
|
|
Packit |
c00610 |
printf("%s:%ld: [MultiLine - START] -%s- [MultiLine - END]\n",
|
|
Packit |
c00610 |
cmd->configfile->filename, cmd->configfile->line, cmd->data.str);
|
|
Packit |
c00610 |
return NULL;
|
|
Packit |
c00610 |
}
|
|
Packit |
c00610 |
|
|
Packit |
c00610 |
DOTCONF_CB(cb_unknown)
|
|
Packit |
c00610 |
{
|
|
Packit |
c00610 |
int i = 0;
|
|
Packit |
c00610 |
|
|
Packit |
c00610 |
printf("%s:%ld: UNKNOWN [%s]",
|
|
Packit |
c00610 |
cmd->configfile->filename, cmd->configfile->line, cmd->name);
|
|
Packit |
c00610 |
|
|
Packit |
c00610 |
for (i = 0; cmd->data.list[i]; i++)
|
|
Packit |
c00610 |
printf(", %s", cmd->data.list[i]);
|
|
Packit |
c00610 |
printf("\n");
|
|
Packit |
c00610 |
return NULL;
|
|
Packit |
c00610 |
}
|