summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2010-07-06 05:57:20 +0200
committerPatrick McHardy <kaber@trash.net>2010-07-06 05:57:20 +0200
commit653e35bca873414964c9cde0bd98bca3e0bf6692 (patch)
treeff6e17befb8f45d817a67329742339301c1ce65a /src
parent3a3cd6215d49cb02841b2b20cf8fa9b91de3a831 (diff)
debug: properly parse debug levels
Signed-off-by: Patrick McHardy <kaber@trash.net>
Diffstat (limited to 'src')
-rw-r--r--src/evaluate.c32
-rw-r--r--src/main.c56
-rw-r--r--src/parser.y8
3 files changed, 77 insertions, 19 deletions
diff --git a/src/evaluate.c b/src/evaluate.c
index f3723779..6330a806 100644
--- a/src/evaluate.c
+++ b/src/evaluate.c
@@ -23,8 +23,6 @@
#include <gmputil.h>
#include <utils.h>
-#define TRACE 0
-
static int expr_evaluate(struct eval_ctx *ctx, struct expr **expr);
static int stmt_evaluate(struct eval_ctx *ctx, struct stmt *stmt);
@@ -963,10 +961,12 @@ range:
static int expr_evaluate(struct eval_ctx *ctx, struct expr **expr)
{
-#if TRACE
- struct error_record *erec;
- erec = erec_create(EREC_INFORMATIONAL, &(*expr)->location, "Evaluate");
- erec_print(stdout, erec); expr_print(*expr); printf("\n\n");
+#ifdef DEBUG
+ if (debug_level & DEBUG_EVALUATION) {
+ struct error_record *erec;
+ erec = erec_create(EREC_INFORMATIONAL, &(*expr)->location, "Evaluate");
+ erec_print(stdout, erec); expr_print(*expr); printf("\n\n");
+ }
#endif
switch ((*expr)->ops->type) {
@@ -1074,10 +1074,12 @@ static int stmt_evaluate_nat(struct eval_ctx *ctx, struct stmt *stmt)
static int stmt_evaluate(struct eval_ctx *ctx, struct stmt *stmt)
{
-#if TRACE
- struct error_record *erec;
- erec = erec_create(EREC_INFORMATIONAL, &stmt->location, "Evaluate");
- erec_print(stdout, erec); stmt_print(stmt); printf("\n\n");
+#ifdef DEBUG
+ if (debug_level & DEBUG_EVALUATION) {
+ struct error_record *erec;
+ erec = erec_create(EREC_INFORMATIONAL, &stmt->location, "Evaluate");
+ erec_print(stdout, erec); stmt_print(stmt); printf("\n\n");
+ }
#endif
switch (stmt->ops->type) {
@@ -1241,10 +1243,12 @@ static int cmd_evaluate_delete(struct eval_ctx *ctx, struct cmd *cmd)
static int cmd_evaluate(struct eval_ctx *ctx, struct cmd *cmd)
{
-#if TRACE
- struct error_record *erec;
- erec = erec_create(EREC_INFORMATIONAL, &cmd->location, "Evaluate");
- erec_print(stdout, erec); printf("\n\n");
+#ifdef DEBUG
+ if (debug_level & DEBUG_EVALUATION) {
+ struct error_record *erec;
+ erec = erec_create(EREC_INFORMATIONAL, &cmd->location, "Evaluate");
+ erec_print(stdout, erec); printf("\n\n");
+ }
#endif
ctx->cmd = cmd;
diff --git a/src/main.c b/src/main.c
index 21606ee7..8c970b52 100644
--- a/src/main.c
+++ b/src/main.c
@@ -102,12 +102,40 @@ static void show_help(const char *name)
" Internet services, user IDs and group IDs numerically.\n"
" -i/--includepath <directory> Add <directory> to the paths searched for include files.\n"
#ifdef DEBUG
-" --debug <level> Specify debugging level\n"
+" --debug <level [,level...]> Specify debugging level (scanner, parser, eval, netlink, all)\n"
#endif
"\n",
name);
}
+#ifdef DEBUG
+static const struct {
+ const char *name;
+ enum debug_level level;
+} debug_param[] = {
+ {
+ .name = "scanner",
+ .level = DEBUG_SCANNER,
+ },
+ {
+ .name = "parser",
+ .level = DEBUG_PARSER,
+ },
+ {
+ .name = "eval",
+ .level = DEBUG_EVALUATION,
+ },
+ {
+ .name = "netlink",
+ .level = DEBUG_NETLINK,
+ },
+ {
+ .name = "all",
+ .level = ~0,
+ },
+};
+#endif
+
static const struct input_descriptor indesc_cmdline = {
.type = INDESC_BUFFER,
.name = "<cmdline>",
@@ -158,7 +186,31 @@ int main(int argc, char * const *argv)
break;
#ifdef DEBUG
case OPT_DEBUG:
- debug_level |= DEBUG_NETLINK;
+ for (;;) {
+ unsigned int i;
+ char *end;
+
+ end = strchr(optarg, ',');
+ if (end)
+ *end = '\0';
+
+ for (i = 0; i < array_size(debug_param); i++) {
+ if (strcmp(debug_param[i].name, optarg))
+ continue;
+ debug_level |= debug_param[i].level;
+ break;
+ }
+
+ if (i == array_size(debug_param)) {
+ fprintf(stderr, "invalid debug parameter `%s'\n",
+ optarg);
+ exit(NFT_EXIT_FAILURE);
+ }
+
+ if (end == NULL)
+ break;
+ optarg = end + 1;
+ }
break;
#endif
case OPT_INVALID:
diff --git a/src/parser.y b/src/parser.y
index 7668cbf2..f70b505d 100644
--- a/src/parser.y
+++ b/src/parser.y
@@ -101,9 +101,11 @@ static void location_update(struct location *loc, struct location *rhs, int n)
%initial-action {
location_init(scanner, state, &yylloc);
-#if 0
- nft_set_debug(1, scanner);
- yydebug = 1;
+#ifdef DEBUG
+ if (debug_level & DEBUG_SCANNER)
+ nft_set_debug(1, scanner);
+ if (debug_level & DEBUG_PARSER)
+ yydebug = 1;
#endif
}