|
@@ -13,6 +13,7 @@
|
|
|
#include <faux/faux.h>
|
|
|
#include <faux/str.h>
|
|
|
#include <faux/list.h>
|
|
|
+#include <faux/ini.h>
|
|
|
|
|
|
#include <klish/ktp_session.h>
|
|
|
|
|
@@ -33,7 +34,10 @@ struct options *opts_init(void)
|
|
|
opts->stop_on_error = BOOL_FALSE;
|
|
|
opts->dry_run = BOOL_FALSE;
|
|
|
opts->quiet = BOOL_FALSE;
|
|
|
+ opts->cfgfile = faux_str_dup(DEFAULT_CFGFILE);
|
|
|
+ opts->cfgfile_userdefined = BOOL_FALSE;
|
|
|
opts->unix_socket_path = faux_str_dup(KLISH_DEFAULT_UNIX_SOCKET_PATH);
|
|
|
+ opts->pager = faux_str_dup(DEFAULT_PAGER);
|
|
|
|
|
|
// Don't free command list because elements are the pointers to
|
|
|
// command line options and don't need to be freed().
|
|
@@ -52,7 +56,9 @@ void opts_free(struct options *opts)
|
|
|
{
|
|
|
if (!opts)
|
|
|
return;
|
|
|
+ faux_str_free(opts->cfgfile);
|
|
|
faux_str_free(opts->unix_socket_path);
|
|
|
+ faux_str_free(opts->pager);
|
|
|
faux_list_free(opts->commands);
|
|
|
faux_list_free(opts->files);
|
|
|
|
|
@@ -64,14 +70,14 @@ void opts_free(struct options *opts)
|
|
|
*/
|
|
|
int opts_parse(int argc, char *argv[], struct options *opts)
|
|
|
{
|
|
|
- static const char *shortopts = "hvS:c:edq";
|
|
|
+ static const char *shortopts = "hvf:c:erq";
|
|
|
static const struct option longopts[] = {
|
|
|
- {"socket", 1, NULL, 'S'},
|
|
|
+ {"conf", 1, NULL, 'f'},
|
|
|
{"help", 0, NULL, 'h'},
|
|
|
{"verbose", 0, NULL, 'v'},
|
|
|
{"command", 1, NULL, 'c'},
|
|
|
{"stop-on-error", 0, NULL, 'e'},
|
|
|
- {"dry-run", 0, NULL, 'd'},
|
|
|
+ {"dry-run", 0, NULL, 'r'},
|
|
|
{"quiet", 0, NULL, 'q'},
|
|
|
{NULL, 0, NULL, 0}
|
|
|
};
|
|
@@ -84,17 +90,13 @@ int opts_parse(int argc, char *argv[], struct options *opts)
|
|
|
if (-1 == opt)
|
|
|
break;
|
|
|
switch (opt) {
|
|
|
- case 'S':
|
|
|
- faux_str_free(opts->unix_socket_path);
|
|
|
- opts->unix_socket_path = faux_str_dup(optarg);
|
|
|
- break;
|
|
|
case 'v':
|
|
|
opts->verbose = BOOL_TRUE;
|
|
|
break;
|
|
|
case 'e':
|
|
|
opts->stop_on_error = BOOL_TRUE;
|
|
|
break;
|
|
|
- case 'd':
|
|
|
+ case 'r':
|
|
|
opts->dry_run = BOOL_TRUE;
|
|
|
break;
|
|
|
case 'q':
|
|
@@ -107,6 +109,11 @@ int opts_parse(int argc, char *argv[], struct options *opts)
|
|
|
case 'c':
|
|
|
faux_list_add(opts->commands, optarg);
|
|
|
break;
|
|
|
+ case 'f':
|
|
|
+ faux_str_free(opts->cfgfile);
|
|
|
+ opts->cfgfile = faux_str_dup(optarg);
|
|
|
+ opts->cfgfile_userdefined = BOOL_TRUE;
|
|
|
+ break;
|
|
|
default:
|
|
|
help(-1, argv[0]);
|
|
|
_exit(-1);
|
|
@@ -158,13 +165,50 @@ void help(int status, const char *argv0)
|
|
|
printf("Usage : %s [options] [filename] ... [filename]\n", name);
|
|
|
printf("Klish client\n");
|
|
|
printf("Options :\n");
|
|
|
- printf("\t-S <path>, --socket=<path> UNIX socket path.\n");
|
|
|
printf("\t-h, --help Print this help.\n");
|
|
|
printf("\t-v, --verbose Be verbose.\n");
|
|
|
printf("\t-c <line>, --command=<line> Command to execute.\n"
|
|
|
"\t\tMultiple options are allowed.\n");
|
|
|
printf("\t-e, --stop-on-error Stop script execution on error.\n");
|
|
|
printf("\t-q, --quiet Disable echo while executing commands\n\t\tfrom the file stream.\n");
|
|
|
- printf("\t-d, --dry-run Don't actually execute ACTION scripts.\n");
|
|
|
+ printf("\t-r, --dry-run Don't actually execute ACTION scripts.\n");
|
|
|
+ printf("\t-f <path>, --conf=<path> Config file ("
|
|
|
+ DEFAULT_CFGFILE ").\n");
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/** @brief Parse config file
|
|
|
+ *
|
|
|
+ */
|
|
|
+bool_t config_parse(const char *cfgfile, struct options *opts)
|
|
|
+{
|
|
|
+ faux_ini_t *ini = NULL;
|
|
|
+ const char *tmp = NULL;
|
|
|
+
|
|
|
+ ini = faux_ini_new();
|
|
|
+ assert(ini);
|
|
|
+ if (!ini)
|
|
|
+ NULL;
|
|
|
+ if (!faux_ini_parse_file(ini, cfgfile)) {
|
|
|
+ fprintf(stderr, "Error: Can't parse config file \"%s\"\n", cfgfile);
|
|
|
+ faux_ini_free(ini);
|
|
|
+ return BOOL_FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+ // UnixSocketPath
|
|
|
+ if ((tmp = faux_ini_find(ini, "UnixSocketPath"))) {
|
|
|
+ faux_str_free(opts->unix_socket_path);
|
|
|
+ opts->unix_socket_path = faux_str_dup(tmp);
|
|
|
}
|
|
|
+
|
|
|
+ // DBs
|
|
|
+ if ((tmp = faux_ini_find(ini, "Pager"))) {
|
|
|
+ faux_str_free(opts->pager);
|
|
|
+ opts->pager = faux_str_dup(tmp);
|
|
|
+ }
|
|
|
+
|
|
|
+ faux_ini_free(ini);
|
|
|
+
|
|
|
+ return BOOL_TRUE;
|
|
|
}
|