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>