|
version 1.1.1.1, 2017/01/24 14:48:56
|
version 1.1.1.2, 2021/03/17 00:49:17
|
|
Line 5
|
Line 5
|
| #include <stdio.h> |
#include <stdio.h> |
| #include <string.h> |
#include <string.h> |
| #include <errno.h> |
#include <errno.h> |
| |
#include <locale.h> |
| #include <confuse.h> |
#include <confuse.h> |
| |
|
| /* valid values for the auto-create-bookmark option */ |
/* valid values for the auto-create-bookmark option */ |
|
Line 15
|
Line 16
|
| /* called on alias() functions in the config file */ |
/* called on alias() functions in the config file */ |
| int conf_alias(cfg_t *cfg, cfg_opt_t *opt, int argc, const char **argv) |
int conf_alias(cfg_t *cfg, cfg_opt_t *opt, int argc, const char **argv) |
| { |
{ |
| if(argc < 2) | if (argc < 2) { |
| { | cfg_error(cfg, "function '%s' requires 2 arguments", cfg_opt_name(opt)); |
| cfg_error(cfg, "function '%s' requires 2 arguments", cfg_opt_name(opt)); | return -1; |
| return -1; | } |
| } | printf("got alias '%s' = '%s'\n", argv[0], argv[1]); |
| printf("got alias '%s' = '%s'\n", argv[0], argv[1]); | return 0; |
| return 0; | |
| } |
} |
| |
|
| /* parse values for the auto-create-bookmark option */ |
/* parse values for the auto-create-bookmark option */ |
| int conf_parse_acb(cfg_t *cfg, cfg_opt_t *opt, const char *value, void *result) |
int conf_parse_acb(cfg_t *cfg, cfg_opt_t *opt, const char *value, void *result) |
| { |
{ |
| if(strcmp(value, "yes") == 0) | if (strcmp(value, "yes") == 0) |
| *(int *)result = ACB_YES; | *(int *)result = ACB_YES; |
| else if(strcmp(value, "no") == 0) | else if (strcmp(value, "no") == 0) |
| *(int *)result = ACB_NO; | *(int *)result = ACB_NO; |
| else if(strcmp(value, "ask") == 0) | else if (strcmp(value, "ask") == 0) |
| *(int *)result = ACB_ASK; | *(int *)result = ACB_ASK; |
| else | else { |
| { | cfg_error(cfg, "invalid value for option '%s': %s", cfg_opt_name(opt), value); |
| cfg_error(cfg, "invalid value for option '%s': %s", | return -1; |
| cfg_opt_name(opt), value); | } |
| return -1; | return 0; |
| } | |
| return 0; | |
| } |
} |
| |
|
| /* validates a port option (must be positive) */ |
/* validates a port option (must be positive) */ |
| int conf_validate_port(cfg_t *cfg, cfg_opt_t *opt) |
int conf_validate_port(cfg_t *cfg, cfg_opt_t *opt) |
| { |
{ |
| int value = cfg_opt_getnint(opt, 0); | int value = cfg_opt_getnint(opt, 0); |
| if(value <= 0) | |
| { | if (value <= 0) { |
| cfg_error(cfg, "invalid port %d in section '%s'", value, cfg_name(cfg)); | cfg_error(cfg, "invalid port %d in section '%s'", value, cfg_name(cfg)); |
| return -1; | return -1; |
| } | } |
| return 0; | return 0; |
| } |
} |
| |
|
| /* validates a bookmark section (host option required) */ |
/* validates a bookmark section (host option required) */ |
| int conf_validate_bookmark(cfg_t *cfg, cfg_opt_t *opt) |
int conf_validate_bookmark(cfg_t *cfg, cfg_opt_t *opt) |
| { |
{ |
| cfg_t *bookmark = cfg_opt_getnsec(opt, cfg_opt_size(opt) - 1); | cfg_t *bookmark = cfg_opt_getnsec(opt, cfg_opt_size(opt) - 1); |
| if(cfg_size(bookmark, "host") == 0) | |
| { | if (cfg_size(bookmark, "host") == 0) { |
| cfg_error(cfg, "missing required option 'host' in bookmark"); | cfg_error(cfg, "missing required option 'host' in bookmark"); |
| return -1; | return -1; |
| } | } |
| return 0; | return 0; |
| } |
} |
| |
|
| cfg_t *parse_conf(const char *filename) |
cfg_t *parse_conf(const char *filename) |
| { |
{ |
| cfg_opt_t bookmark_opts[] = { | static cfg_opt_t bookmark_opts[] = { |
| CFG_STR("host", 0, CFGF_NODEFAULT), | CFG_STR("host", 0, CFGF_NODEFAULT), |
| CFG_INT("port", 21, CFGF_NONE), | CFG_INT("port", 21, CFGF_NONE), |
| CFG_STR("login", "anonymous", CFGF_NONE), | CFG_STR("login", "anonymous", CFGF_NONE), |
| CFG_STR("password", "anonymous@", CFGF_NONE), | CFG_STR("password", "anonymous@", CFGF_NONE), |
| CFG_STR("directory", 0, CFGF_NONE), | CFG_STR("directory", 0, CFGF_NONE), |
| CFG_END() | CFG_END() |
| }; | }; |
| |
|
| cfg_opt_t opts[] = { | cfg_opt_t opts[] = { |
| CFG_SEC("bookmark", bookmark_opts, CFGF_MULTI | CFGF_TITLE), | CFG_SEC("bookmark", bookmark_opts, CFGF_MULTI | CFGF_TITLE), |
| CFG_BOOL("passive-mode", cfg_false, CFGF_NONE), | CFG_BOOL("passive-mode", cfg_false, CFGF_NONE), |
| CFG_BOOL("remote-completion", cfg_true, CFGF_NONE), | CFG_BOOL("remote-completion", cfg_true, CFGF_NONE), |
| CFG_FUNC("alias", conf_alias), | CFG_FUNC("alias", conf_alias), |
| CFG_STR_LIST("xterm-terminals", "{xterm, rxvt}", CFGF_NONE), | CFG_STR_LIST("xterm-terminals", "{xterm, rxvt}", CFGF_NONE), |
| CFG_INT_CB("auto-create-bookmark", ACB_YES, CFGF_NONE, conf_parse_acb), | CFG_INT_CB("auto-create-bookmark", ACB_YES, CFGF_NONE, conf_parse_acb), |
| CFG_FUNC("include-file", cfg_include), | CFG_FUNC("include-file", cfg_include), |
| CFG_END() | CFG_END() |
| }; | }; |
| |
|
| cfg_t *cfg = cfg_init(opts, CFGF_NONE); | cfg_t *cfg = cfg_init(opts, CFGF_NONE); |
| cfg_set_validate_func(cfg, "bookmark|port", conf_validate_port); | |
| cfg_set_validate_func(cfg, "bookmark", conf_validate_bookmark); | |
| |
|
| switch(cfg_parse(cfg, filename)) | cfg_set_validate_func(cfg, "bookmark|port", conf_validate_port); |
| { | cfg_set_validate_func(cfg, "bookmark", conf_validate_bookmark); |
| case CFG_FILE_ERROR: | |
| printf("warning: configuration file '%s' could not be read: %s\n", | |
| filename, strerror(errno)); | |
| printf("continuing with default values...\n\n"); | |
| case CFG_SUCCESS: | |
| break; | |
| case CFG_PARSE_ERROR: | |
| return 0; | |
| } | |
| |
|
| return cfg; | switch (cfg_parse(cfg, filename)) { |
| | case CFG_FILE_ERROR: |
| | printf("warning: configuration file '%s' could not be read: %s\n", filename, strerror(errno)); |
| | printf("continuing with default values...\n\n"); |
| | case CFG_SUCCESS: |
| | break; |
| | case CFG_PARSE_ERROR: |
| | return 0; |
| | } |
| | |
| | return cfg; |
| } |
} |
| |
|
| |
/* Parse the file ftp.conf and print the parsed configuration options */ |
| int main(int argc, char **argv) |
int main(int argc, char **argv) |
| { |
{ |
| int i; | cfg_t *cfg; |
| cfg_t *cfg = parse_conf(argc > 1 ? argv[1] : "ftp.conf"); | |
| |
|
| /* print the parsed configuration options */ | /* Localize messages & types according to environment, since v2.9 */ |
| if(cfg) | #ifdef LC_MESSAGES |
| { | setlocale(LC_MESSAGES, ""); |
| printf("passive-mode = %s\n", | setlocale(LC_CTYPE, ""); |
| cfg_getbool(cfg, "passive-mode") ? "true" : "false"); | #endif |
| printf("remote-completion = %s\n", | |
| cfg_getbool(cfg, "remote-completion") ? "true" : "false"); | |
| |
|
| printf("number of bookmarks: %d\n", cfg_size(cfg, "bookmark")); | cfg = parse_conf(argc > 1 ? argv[1] : "ftp.conf"); |
| for(i = 0; i < cfg_size(cfg, "bookmark"); i++) | if (cfg) { |
| { | unsigned int 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("passive-mode = %s\n", cfg_getbool(cfg, "passive-mode") ? "true" : "false"); |
| { | printf("remote-completion = %s\n", cfg_getbool(cfg, "remote-completion") ? "true" : "false"); |
| printf("xterm-terminal #%d: %s\n", | |
| i+1, cfg_getnstr(cfg, "xterm-terminals", i)); | |
| } | |
| |
|
| printf("auto-create-bookmark = %ld\n", | printf("number of bookmarks: %d\n", cfg_size(cfg, "bookmark")); |
| cfg_getint(cfg, "auto-create-bookmark")); | for (i = 0; i < cfg_size(cfg, "bookmark"); i++) { |
| cfg_free(cfg); | cfg_t *bookmark = cfg_getnsec(cfg, "bookmark", i); |
| } | |
| |
|
| return 0; | 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; |
| |
} |