Annotation of embedaddon/confuse/examples/ftpconf.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Parses and prints the configuration options for a fictous ftp client
! 3: */
! 4:
! 5: #include <stdio.h>
! 6: #include <string.h>
! 7: #include <errno.h>
! 8: #include <confuse.h>
! 9:
! 10: /* valid values for the auto-create-bookmark option */
! 11: #define ACB_YES 1
! 12: #define ACB_NO 2
! 13: #define ACB_ASK 3
! 14:
! 15: /* called on alias() functions in the config file */
! 16: int conf_alias(cfg_t *cfg, cfg_opt_t *opt, int argc, const char **argv)
! 17: {
! 18: if(argc < 2)
! 19: {
! 20: cfg_error(cfg, "function '%s' requires 2 arguments", cfg_opt_name(opt));
! 21: return -1;
! 22: }
! 23: printf("got alias '%s' = '%s'\n", argv[0], argv[1]);
! 24: return 0;
! 25: }
! 26:
! 27: /* parse values for the auto-create-bookmark option */
! 28: int conf_parse_acb(cfg_t *cfg, cfg_opt_t *opt, const char *value, void *result)
! 29: {
! 30: if(strcmp(value, "yes") == 0)
! 31: *(int *)result = ACB_YES;
! 32: else if(strcmp(value, "no") == 0)
! 33: *(int *)result = ACB_NO;
! 34: else if(strcmp(value, "ask") == 0)
! 35: *(int *)result = ACB_ASK;
! 36: else
! 37: {
! 38: cfg_error(cfg, "invalid value for option '%s': %s",
! 39: cfg_opt_name(opt), value);
! 40: return -1;
! 41: }
! 42: return 0;
! 43: }
! 44:
! 45: /* validates a port option (must be positive) */
! 46: int conf_validate_port(cfg_t *cfg, cfg_opt_t *opt)
! 47: {
! 48: int value = cfg_opt_getnint(opt, 0);
! 49: if(value <= 0)
! 50: {
! 51: cfg_error(cfg, "invalid port %d in section '%s'", value, cfg_name(cfg));
! 52: return -1;
! 53: }
! 54: return 0;
! 55: }
! 56:
! 57: /* validates a bookmark section (host option required) */
! 58: int conf_validate_bookmark(cfg_t *cfg, cfg_opt_t *opt)
! 59: {
! 60: cfg_t *bookmark = cfg_opt_getnsec(opt, cfg_opt_size(opt) - 1);
! 61: if(cfg_size(bookmark, "host") == 0)
! 62: {
! 63: cfg_error(cfg, "missing required option 'host' in bookmark");
! 64: return -1;
! 65: }
! 66: return 0;
! 67: }
! 68:
! 69: cfg_t *parse_conf(const char *filename)
! 70: {
! 71: cfg_opt_t bookmark_opts[] = {
! 72: CFG_STR("host", 0, CFGF_NODEFAULT),
! 73: CFG_INT("port", 21, CFGF_NONE),
! 74: CFG_STR("login", "anonymous", CFGF_NONE),
! 75: CFG_STR("password", "anonymous@", CFGF_NONE),
! 76: CFG_STR("directory", 0, CFGF_NONE),
! 77: CFG_END()
! 78: };
! 79:
! 80: cfg_opt_t opts[] = {
! 81: CFG_SEC("bookmark", bookmark_opts, CFGF_MULTI | CFGF_TITLE),
! 82: CFG_BOOL("passive-mode", cfg_false, CFGF_NONE),
! 83: CFG_BOOL("remote-completion", cfg_true, CFGF_NONE),
! 84: CFG_FUNC("alias", conf_alias),
! 85: CFG_STR_LIST("xterm-terminals", "{xterm, rxvt}", CFGF_NONE),
! 86: CFG_INT_CB("auto-create-bookmark", ACB_YES, CFGF_NONE, conf_parse_acb),
! 87: CFG_FUNC("include-file", cfg_include),
! 88: CFG_END()
! 89: };
! 90:
! 91: cfg_t *cfg = cfg_init(opts, CFGF_NONE);
! 92: cfg_set_validate_func(cfg, "bookmark|port", conf_validate_port);
! 93: cfg_set_validate_func(cfg, "bookmark", conf_validate_bookmark);
! 94:
! 95: switch(cfg_parse(cfg, filename))
! 96: {
! 97: case CFG_FILE_ERROR:
! 98: printf("warning: configuration file '%s' could not be read: %s\n",
! 99: filename, strerror(errno));
! 100: printf("continuing with default values...\n\n");
! 101: case CFG_SUCCESS:
! 102: break;
! 103: case CFG_PARSE_ERROR:
! 104: return 0;
! 105: }
! 106:
! 107: return cfg;
! 108: }
! 109:
! 110: int main(int argc, char **argv)
! 111: {
! 112: int i;
! 113: cfg_t *cfg = parse_conf(argc > 1 ? argv[1] : "ftp.conf");
! 114:
! 115: /* print the parsed configuration options */
! 116: if(cfg)
! 117: {
! 118: printf("passive-mode = %s\n",
! 119: cfg_getbool(cfg, "passive-mode") ? "true" : "false");
! 120: printf("remote-completion = %s\n",
! 121: cfg_getbool(cfg, "remote-completion") ? "true" : "false");
! 122:
! 123: printf("number of bookmarks: %d\n", cfg_size(cfg, "bookmark"));
! 124: for(i = 0; i < cfg_size(cfg, "bookmark"); i++)
! 125: {
! 126: cfg_t *bookmark = cfg_getnsec(cfg, "bookmark", i);
! 127: printf(" bookmark #%d: %s:%s@%s:%ld%s\n", i+1,
! 128: cfg_getstr(bookmark, "login"),
! 129: cfg_getstr(bookmark, "password"),
! 130: cfg_getstr(bookmark, "host"),
! 131: cfg_getint(bookmark, "port"),
! 132: cfg_getstr(bookmark, "directory"));
! 133: }
! 134:
! 135: for(i = 0; i < cfg_size(cfg, "xterm-terminals"); i++)
! 136: {
! 137: printf("xterm-terminal #%d: %s\n",
! 138: i+1, cfg_getnstr(cfg, "xterm-terminals", i));
! 139: }
! 140:
! 141: printf("auto-create-bookmark = %ld\n",
! 142: cfg_getint(cfg, "auto-create-bookmark"));
! 143: cfg_free(cfg);
! 144: }
! 145:
! 146: return 0;
! 147: }
! 148:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>