* Added a new --stanza-list command line to fwknop to dump the stanzas
authorFranck Joncourt <franck@debian.org>
Tue, 30 Jul 2013 19:38:54 +0000 (21:38 +0200)
committerFranck Joncourt <franck@debian.org>
Tue, 30 Jul 2013 19:38:54 +0000 (21:38 +0200)
  configured in ./fwknoprc. The default stanza is not displayed.

client/cmd_opts.h
client/config_init.c
client/fwknop_common.h

index 33d7529..0d689cf 100644 (file)
@@ -43,6 +43,7 @@ enum {
     TIME_OFFSET_PLUS,
     SAVE_RC_STANZA,
     FORCE_SAVE_RC_STANZA,
+    STANZA_LIST,
     NO_SAVE_ARGS,
     SHOW_LAST_ARGS,
     RC_FILE_PATH,
@@ -85,6 +86,7 @@ static struct option cmd_opts[] =
     {"save-packet",         1, NULL, 'B'},
     {"save-rc-stanza",      0, NULL, SAVE_RC_STANZA},
     {"force-stanza",        0, NULL, FORCE_SAVE_RC_STANZA},
+    {"stanza-list",         0, NULL, STANZA_LIST},
     {"no-save-args",        0, NULL, NO_SAVE_ARGS},
     {"server-cmd",          1, NULL, 'C'},
     {"digest-type",         1, NULL, FKO_DIGEST_NAME},
index 77ad1c2..4807c3e 100644 (file)
@@ -563,6 +563,55 @@ is_rc_param(const char *line, rc_file_param_t *param)
     return 1;
 }
 
+/**
+ * @brief Dump available stanzas from an fwknoprc file
+ *
+ * @param rcfile path to the rcfile to parse
+ */
+static void
+dump_configured_stanzas_from_rcfile(const char* rcfile)
+{
+    FILE   *rc;
+    char    line[MAX_LINE_LEN]   = {0};
+    char    curr_stanza[MAX_LINE_LEN] = {0};
+
+    /* Open the rcfile in read mode */
+    if ((rc = fopen(rcfile, "r")) == NULL)
+    {
+        log_msg(LOG_VERBOSITY_WARNING, "Unable to open rc file: %s: %s",
+            rcfile, strerror(errno));
+
+        return;
+    }
+
+    log_msg(LOG_VERBOSITY_NORMAL, "The following stanzas are configured in %s :", rcfile);
+
+    /* Parse the rcfile line by line to find stanza */
+    while ((fgets(line, MAX_LINE_LEN, rc)) != NULL)
+    {
+        line[MAX_LINE_LEN-1] = '\0';
+
+        /* Get past comments and empty lines (note: we only look at the first
+         * character. */
+        if(IS_EMPTY_LINE(line[0]))
+            continue;
+
+        /* Check which section we are working on */
+        else if (is_rc_section(line, strlen(line), curr_stanza, sizeof(curr_stanza)))
+        {
+            /* Print the stanza and continue - we exclude the default stanza */
+            if (strcasecmp(curr_stanza, RC_SECTION_DEFAULT) != 0)
+                log_msg(LOG_VERBOSITY_NORMAL, " - %s", curr_stanza);
+            continue;
+        }
+
+        /* Nothing we care about */
+        else;
+    }
+
+    fclose(rc);
+}
+
 /* Assign path to fwknop rc file
 */
 static void
@@ -1752,6 +1801,7 @@ config_init(fko_cli_options_t *options, int argc, char **argv)
 {
     int                 cmd_arg, index, is_err;
     fko_var_bitmask_t   var_bitmask;
+    char                rcfile[MAX_PATH_LEN] = {0};
 
     /* Zero out options, opts_track and bitmask.
     */
@@ -1780,6 +1830,9 @@ config_init(fko_cli_options_t *options, int argc, char **argv)
             case SAVE_RC_STANZA:
                 options->save_rc_stanza = 1;
                 break;
+            case STANZA_LIST:
+                options->stanza_list = 1;
+                break;
             case 'E':
                 strlcpy(options->args_save_file, optarg, sizeof(options->args_save_file));
                 break;
@@ -1796,6 +1849,14 @@ config_init(fko_cli_options_t *options, int argc, char **argv)
     /* Update the verbosity level for the log module */
     log_set_verbosity(LOG_DEFAULT_VERBOSITY + options->verbose);
 
+    /* Dump the configured stanzas from an rcfile */
+    if (options->stanza_list == 1)
+    {
+        set_rc_file(rcfile, options);
+        dump_configured_stanzas_from_rcfile(rcfile);
+        exit(EXIT_SUCCESS);
+    }
+
     /* First process the .fwknoprc file.
     */
     process_rc_section(RC_SECTION_DEFAULT, options);
@@ -2305,6 +2366,8 @@ usage(void)
       "                             -n option.\n"
       "     --force-stanza          Used with --save-rc-stanza to overwrite all of\n"
       "                             the variables for the specified stanza\n"
+      "     --stanza-list           Dump a list of the stanzas found in\n"
+      "                             $HOME/.fwknoprc\n"
       "     --nat-local             Access a local service via a forwarded port\n"
       "                             on the fwknopd server system.\n"
       "     --nat-port              Specify the port to forward to access a\n"
index 3718dc3..ad5a34a 100644 (file)
@@ -161,6 +161,7 @@ typedef struct fko_cli_options
     unsigned char   got_named_stanza;
     unsigned char   save_rc_stanza;
     unsigned char   force_save_rc_stanza;
+    unsigned char   stanza_list;
 
     int input_fd;