#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <locale.h>
#define ACB_YES 1
#define ACB_NO 2
#define ACB_ASK 3
int conf_alias(
cfg_t *cfg,
cfg_opt_t *opt,
int argc,
const char **argv)
{
if (argc < 2) {
cfg_error(cfg, "function '%s' requires 2 arguments", cfg_opt_name(opt));
return -1;
}
printf("got alias '%s' = '%s'\n", argv[0], argv[1]);
return 0;
}
int conf_parse_acb(
cfg_t *cfg,
cfg_opt_t *opt,
const char *value,
void *result)
{
if (strcmp(value, "yes") == 0)
*(long int *)result = ACB_YES;
else if (strcmp(value, "no") == 0)
*(long int *)result = ACB_NO;
else if (strcmp(value, "ask") == 0)
*(long int *)result = ACB_ASK;
else {
cfg_error(cfg, "invalid value for option '%s': %s", cfg_opt_name(opt), value);
return -1;
}
return 0;
}
{
int value = cfg_opt_getnint(opt, 0);
if (value <= 0) {
cfg_error(cfg, "invalid port %d in section '%s'", value, cfg_name(cfg));
return -1;
}
return 0;
}
{
cfg_t *bookmark = cfg_opt_getnsec(opt, cfg_opt_size(opt) - 1);
if (cfg_size(bookmark, "host") == 0) {
cfg_error(cfg, "missing required option 'host' in bookmark");
return -1;
}
return 0;
}
cfg_t *parse_conf(
const char *filename)
{
};
};
cfg_set_validate_func(cfg, "bookmark|port", conf_validate_port);
cfg_set_validate_func(cfg, "bookmark", conf_validate_bookmark);
switch (cfg_parse(cfg, filename)) {
printf("warning: configuration file '%s' could not be read: %s\n", filename, strerror(errno));
printf("continuing with default values...\n\n");
break;
return NULL;
}
return cfg;
}
int main(int argc, char **argv)
{
#ifdef LC_MESSAGES
setlocale(LC_MESSAGES, "");
setlocale(LC_CTYPE, "");
#endif
cfg = parse_conf(argc > 1 ? argv[1] : "ftp.conf");
if (cfg) {
unsigned int i;
printf("passive-mode = %s\n", cfg_getbool(cfg, "passive-mode") ? "true" : "false");
printf("remote-completion = %s\n", cfg_getbool(cfg, "remote-completion") ? "true" : "false");
printf("number of bookmarks: %d\n", cfg_size(cfg, "bookmark"));
for (i = 0; i < cfg_size(cfg, "bookmark"); i++) {
cfg_t *bookmark = cfg_getnsec(cfg,
"bookmark", i);
printf(" bookmark #%d: %s:%s@%s:%ld%s\n", i + 1,
cfg_getstr(bookmark, "login"),
cfg_getstr(bookmark, "password"),
cfg_getstr(bookmark, "host"), cfg_getint(bookmark, "port"), cfg_getstr(bookmark, "directory"));
}
for (i = 0; i < cfg_size(cfg, "xterm-terminals"); i++) {
printf("xterm-terminal #%d: %s\n", i + 1, cfg_getnstr(cfg, "xterm-terminals", i));
}
printf("auto-create-bookmark = %ld\n", cfg_getint(cfg, "auto-create-bookmark"));
cfg_free(cfg);
}
return 0;
}
A configuration file parser library.
#define CFG_SEC(_name, _opts, _flags)
Initialize a section.
Definition confuse.h:790
#define CFG_BOOL(name, def, flags)
Initialize a boolean option.
Definition confuse.h:753
#define CFGF_TITLE
option has a title (only applies to sections)
Definition confuse.h:86
#define CFGF_NONE
Flags.
Definition confuse.h:82
#define CFG_SUCCESS
Success, all OK (POSIX '0')
Definition confuse.h:103
#define CFG_END()
Terminate list of options.
Definition confuse.h:858
#define CFG_INT_CB(name, def, flags, cb)
Initialize an integer option with a value parsing callback.
Definition confuse.h:483
#define CFGF_MULTI
option may be specified multiple times (only applies to sections)
Definition confuse.h:83
#define CFGF_NODEFAULT
option has no default value
Definition confuse.h:87
#define CFG_STR(name, def, flags)
Initialize a string option.
Definition confuse.h:367
#define CFG_PARSE_ERROR
Error parsing the configuration.
Definition confuse.h:106
#define CFG_INT(name, def, flags)
Initialize an integer option.
Definition confuse.h:473
#define CFG_FUNC(_name, _func)
Initialize a function.
Definition confuse.h:805
#define CFG_STR_LIST(name, def, flags)
Initialize a string list option.
Definition confuse.h:381
#define CFG_FILE_ERROR
Error opening the configuration file.
Definition confuse.h:105
Data structure holding information about an option.
Definition confuse.h:324
Data structure holding information about a "section".
Definition confuse.h:250