Annotation of embedaddon/confuse/examples/ftpconf.c, revision 1.1.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>