summaryrefslogtreecommitdiff
path: root/src/pmconfig/pmconfig.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pmconfig/pmconfig.c')
-rw-r--r--src/pmconfig/pmconfig.c153
1 files changed, 153 insertions, 0 deletions
diff --git a/src/pmconfig/pmconfig.c b/src/pmconfig/pmconfig.c
new file mode 100644
index 0000000..882e4ce
--- /dev/null
+++ b/src/pmconfig/pmconfig.c
@@ -0,0 +1,153 @@
+/*
+ * Copyright (c) 2012,2014 Red Hat.
+ * Copyright (c) 2008 Aconex. All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+
+#include "pmapi.h"
+#include "impl.h"
+
+static int apiflag;
+static const char *empty = "";
+static const char *none = "false";
+
+static void
+direct_report(const char *var, const char *val)
+{
+ if (!val || val[0] == '\0')
+ val = empty;
+ printf("%s=%s\n", var, val);
+}
+
+static void
+export_report(const char *var, const char *val)
+{
+ char buffer[4096];
+ const char *p;
+ int i = 0;
+
+ if (!val || val[0] == '\0')
+ val = empty;
+ else {
+ /* ensure we do not leak any problematic characters into export */
+ for (p = val; *p != '\0' && i < sizeof(buffer)-6; p++) {
+ if ((int)*p == '\'') {
+ buffer[i++] = '\'';
+ buffer[i++] = '\\';
+ buffer[i++] = '\'';
+ buffer[i++] = '\'';
+ } else {
+ buffer[i++] = *p;
+ }
+ }
+ buffer[i] = '\0';
+ val = buffer;
+ }
+ if (apiflag) /* API mode: no override allowed */
+ printf("export %s='%s'\n", var, val);
+ else
+ printf("export %s=${%s:-'%s'}\n", var, var, val);
+}
+
+static void
+pcp_conf_extract(char *var, char *prefix, char *val)
+{
+ __pmNativeConfig(var, prefix, val);
+ val = getenv(var);
+ direct_report(var, val);
+}
+
+static void
+pcp_conf_shell_extract(char *var, char *prefix, char *val)
+{
+ __pmNativeConfig(var, prefix, val);
+ val = getenv(var);
+ export_report(var, val);
+}
+
+static pmLongOptions longopts[] = {
+ PMAPI_OPTIONS_HEADER("Reporting options"),
+ { "all", 0, 'a', 0, "show all, unmodified format (default)" },
+ { "list", 0, 'l', 0, "synonym for showing \"all\" (above)" },
+ { "library", 0, 'L', 0, "show library features instead of environment" },
+ { "shell", 0, 's', 0, "show all, quoted format for shell expansion" },
+ PMOPT_HELP,
+ PMAPI_OPTIONS_END
+};
+
+static pmOptions opts = {
+ .short_options = "alLs?",
+ .long_options = longopts,
+ .short_usage = "[variable ...]",
+};
+
+int
+main(int argc, char **argv)
+{
+ int c;
+ int sflag = 0;
+
+ while ((c = pmgetopt_r(argc, argv, &opts)) != EOF) {
+ switch (c) {
+ case 'a': /* show all, default (unmodified) list format */
+ case 'l':
+ sflag = 0;
+ break;
+ case 's': /* show all, guarded format for shell expansion */
+ sflag = 1;
+ break;
+ case 'L':
+ apiflag = 1;
+ break;
+ default:
+ opts.errors++;
+ break;
+ }
+ }
+
+ if (opts.errors) {
+ pmUsageMessage(&opts);
+ exit(1);
+ }
+
+ if (sflag) {
+ putenv("SHELL=/bin/sh");
+ empty = none;
+ }
+
+ /* the complete list of variables is to be reported */
+ if (opts.optind >= argc) {
+ if (apiflag)
+ __pmAPIConfig(sflag ? export_report : direct_report);
+ else
+ __pmConfig(sflag ? pcp_conf_shell_extract : pcp_conf_extract);
+ exit(0);
+ }
+
+ /* an explicit list of variables has been requested */
+ if (sflag) {
+ if (apiflag)
+ for (c = opts.optind; c < argc; c++)
+ export_report(argv[c], __pmGetAPIConfig(argv[c]));
+ else
+ for (c = opts.optind; c < argc; c++)
+ export_report(argv[c], pmGetConfig(argv[c]));
+ } else {
+ if (apiflag)
+ for (c = opts.optind; c < argc; c++)
+ direct_report(argv[c], __pmGetAPIConfig(argv[c]));
+ else
+ for (c = opts.optind; c < argc; c++)
+ direct_report(argv[c], pmGetConfig(argv[c]));
+ }
+ exit(0);
+}