Blame examples/modules/module.c

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
}