--- libaitcfg/src/cfgprog.c 2025/01/30 14:09:54 1.1.2.2 +++ libaitcfg/src/cfgprog.c 2025/01/31 00:03:15 1.2 @@ -3,7 +3,8 @@ cfg_root_t cfg; -char cfgname[MAXPATHLEN], section[STRSIZ]; +char cfgname[MAXPATHLEN], outname[MAXPATHLEN], section[STRSIZ]; +FILE *out; static void @@ -14,6 +15,7 @@ Usage(const char *prog) "==========================================\n" " Syntax: %s [-options] [attribute] [value]\n\n" "\t-s
\tScope of attribute\n" + "\t-o \tWrite updated config to file\n" "\t-w\t\tSet and write attribute\n" "\t-v\t\tVerbose, more -v more verbosity\n" "\t-h\t\tHelp, this help screen!\n", @@ -23,10 +25,36 @@ Usage(const char *prog) int Get(const char *prog, int argc, char **argv) { + const char *str; + int i, ret = 0; + array_t *sec; + struct tagCfg *av; + EVERBS(1) printf("Get value for %s in scope %s from config %s\n", *argv ? *argv : "*", section, prog); - return 0; + if (*argv) { + str = cfg_getAttribute(&cfg, section, *argv); + if (str) + printf("%s=%s\n", *argv, str); + else + ret = 3; + } else { + sec = cfg_getSection(&cfg, section); + if (sec) { + for (i = 0; i < array_Size(sec) && + (av = array(sec, i, struct tagCfg*)); i++) { + if (AIT_GET_STR(&av->cfg_attr)) + printf("%s=%s\n", + AIT_GET_STR(&av->cfg_attr), + AIT_GET_STR(&av->cfg_val)); + } + array_Destroy(&sec); + } else + ret = 3; + } + + return ret; } int @@ -40,6 +68,31 @@ Set(const char *prog, int argc, char **argv) EVERBS(1) printf("Set value %s for %s in scope %s from config %s\n", argv[1], argv[0], section, prog); + if (!*argv[1]) { + if (cfg_unsetAttribute(&cfg, section, argv[0]) < 1) + return 3; + } else if (cfg_setAttribute(&cfg, section, argv[0], argv[1]) < 1) + return 3; + + if (*outname) { + out = fopen(outname, "w"); + if (!out) { + printf("Error:: can't create file %s #%d - %s\n", + outname, errno, strerror(errno)); + return 2; + } + } + + if (cfgWriteConfigRaw(out, &cfg, 42)) { + printf("Error:: can't write config #%d - %s\n", + cfg_GetErrno(), cfg_GetError()); + if (*outname) + fclose(out); + return 2; + } + + if (*outname) + fclose(out); return 0; } @@ -47,11 +100,13 @@ Set(const char *prog, int argc, char **argv) int main(int argc, char **argv) { - int ch; + int ch, ret = 0; int (*run)(const char*, int, char**) = Get; const char *prog; char *str; + out = stdout; + if (!argv || !*argv) prog = "cfgprog"; else if (!(prog = strrchr(*argv, '/'))) @@ -59,8 +114,11 @@ main(int argc, char **argv) else prog++; - while ((ch = getopt(argc, argv, "hvws:")) != -1) + while ((ch = getopt(argc, argv, "hvws:o:")) != -1) switch (ch) { + case 'o': + strlcpy(outname, optarg, sizeof outname); + break; case 'w': run = Set; break; @@ -98,5 +156,14 @@ main(int argc, char **argv) *argv = str; } - return run(prog, argc, argv); + if (cfgLoadConfig(cfgname, &cfg)) { + printf("Error:: load config %s #%d - %s\n", + cfgname, cfg_GetErrno(), cfg_GetError()); + return 2; + } + + ret = run(prog, argc, argv); + + cfgUnloadConfig(&cfg); + return ret; }