diff options
-rw-r--r-- | dfilter-grammar.y | 38 | ||||
-rw-r--r-- | wiretap/wiretap.c | 310 |
2 files changed, 29 insertions, 319 deletions
diff --git a/dfilter-grammar.y b/dfilter-grammar.y index 83490243f8..06d479b891 100644 --- a/dfilter-grammar.y +++ b/dfilter-grammar.y @@ -39,7 +39,6 @@ #endif void dfilter_yacc_init(void); -static void dfilter_print_parse_tree(GNode *gnode); static GNode* dfilter_mknode_join(GNode *n1, enum node_type ntype, int operand, GNode *n2); static GNode* dfilter_mknode_unary(int operand, GNode *n2); static GNode* dfilter_mknode_numeric_variable(gint id); @@ -210,7 +209,11 @@ relation: numeric_variable numeric_relation numeric_value ; -numeric_value: T_VAL_ID { $$ = dfilter_mknode_numeric_value(string_to_value($1)); } +numeric_value: T_VAL_ID + { + $$ = dfilter_mknode_numeric_value(string_to_value($1)); + g_free($1); + } ; ether_value: T_VAL_ID ':' T_VAL_ID ':' T_VAL_ID ':' T_VAL_ID ':' T_VAL_ID ':' T_VAL_ID @@ -225,10 +228,25 @@ ether_value: T_VAL_ID ':' T_VAL_ID ':' T_VAL_ID ':' T_VAL_ID ':' T_VAL_ID ':' T_ } ; -ipv4_value: T_VAL_ID { $$ = dfilter_mknode_ipv4_value($1); } +ipv4_value: T_VAL_ID + { + $$ = dfilter_mknode_ipv4_value($1); + g_free($1); + } ; -bytes_value: numeric_variable +bytes_value: T_VAL_ID + { + GByteArray *barray = g_byte_array_new(); + guint8 val; + char *endptr; + + dfilter_list_byte_arrays = g_slist_append(dfilter_list_byte_arrays, barray); + val = (guint8) strtoul($1, &endptr, 16); + g_byte_array_append(barray, &val, 1); + $$ = dfilter_mknode_bytes_value(barray); + g_free($1); + } | byte_range { $$ = dfilter_mknode_bytes_value($1); } ; @@ -243,6 +261,8 @@ byte_range: T_VAL_ID ':' T_VAL_ID g_byte_array_append(barray, &val, 1); val = (guint8) strtoul($3, &endptr, 16); $$ = g_byte_array_append(barray, &val, 1); + g_free($1); + g_free($3); } | byte_range ':' T_VAL_ID @@ -252,6 +272,7 @@ byte_range: T_VAL_ID ':' T_VAL_ID val = (guint8) strtoul($3, &endptr, 16); $$ = g_byte_array_append($1, &val, 1); + g_free($3); } ; @@ -277,10 +298,13 @@ protocol_name: T_FT_NONE { $$ = dfilter_mknode_existence($1); } bytes_variable: any_variable_type '[' T_VAL_ID ':' T_VAL_ID ']' { $$ = dfilter_mknode_bytes_variable($1, string_to_value($3), string_to_value($5)); + g_free($3); + g_free($5); } | any_variable_type '[' T_VAL_ID ']' { - $$ = dfilter_mknode_bytes_variable($1, string_to_value($3), 0); + $$ = dfilter_mknode_bytes_variable($1, string_to_value($3), 1); + g_free($3); } ; @@ -334,19 +358,15 @@ type_ne: TOK_NE { $$ = $1; } ; type_gt: TOK_GT { $$ = $1; } - | '>' { $$ = TOK_GT; } ; type_ge: TOK_GE { $$ = $1; } - | '>' '=' { $$ = TOK_GE; } ; type_lt: TOK_LT { $$ = $1; } - | '<' { $$ = TOK_LT; } ; type_le: TOK_LE { $$ = $1; } - | '<' '=' { $$ = TOK_LE; } ; diff --git a/wiretap/wiretap.c b/wiretap/wiretap.c deleted file mode 100644 index 01f422298c..0000000000 --- a/wiretap/wiretap.c +++ /dev/null @@ -1,310 +0,0 @@ - -#include <stdio.h> -#include <glib.h> -#include "config.h" -#include "wtap.h" -#include "bpf-engine.h" - -#ifdef HAVE_GLIB10 -#include "glib-new.h" -#endif - -void bpf_dump(wtap *wth); -char *bpf_image(struct bpf_instruction *p, int n); - -int main(int argc, char **argv) -{ - wtap *wth; - char *fsyntax; - int i; - - if (argc <= 1) { - fprintf(stderr, "usage: wiretap filter\n"); - exit(-1); - } - - fsyntax = g_strdup(argv[1]); - - for (i = 2; i < argc; i++) { - fsyntax = g_strjoin(" ", fsyntax, argv[i], NULL); - } - wth = (wtap*)g_malloc(sizeof(wtap)); - - /* initialization */ - wth->file_encap = WTAP_ENCAP_NONE; - wth->filter.offline = NULL; - wth->filter_type = WTAP_FILTER_NONE; - wth->filter_length = 0; - wth->offline_filter_lengths = NULL; - - wtap_offline_filter(wth, fsyntax); - bpf_dump(wth); - - g_free(wth); - return 0; -} - -void -bpf_dump(wtap *wth) -{ - struct bpf_instruction *fentry; - int flen; - int i; - - fentry = wth->filter.offline[WTAP_ENCAP_ETHERNET]; - flen = wth->offline_filter_lengths[WTAP_ENCAP_ETHERNET]; - - /* this loop is from tcpdump's bpf_dump.c */ - for (i = 0; i < flen; ++fentry, ++i) { - puts(bpf_image(fentry, i)); - } -} - -/* this entire function is from libpcap's bpf_image.c */ -char * -bpf_image(struct bpf_instruction *p, int n) -{ - int v; - char *fmt, *op; - static char image[256]; - char operand[64]; - - v = p->k; - switch (p->code) { - - default: - op = "unimp"; - fmt = "0x%x"; - v = p->code; - break; - - case BPF_RET|BPF_K: - op = "ret"; - fmt = "#%d"; - break; - - case BPF_RET|BPF_A: - op = "ret"; - fmt = ""; - break; - - case BPF_LD|BPF_W|BPF_ABS: - op = "ld"; - fmt = "[%d]"; - break; - - case BPF_LD|BPF_H|BPF_ABS: - op = "ldh"; - fmt = "[%d]"; - break; - - case BPF_LD|BPF_B|BPF_ABS: - op = "ldb"; - fmt = "[%d]"; - break; - - case BPF_LD|BPF_W|BPF_LEN: - op = "ld"; - fmt = "#pktlen"; - break; - - case BPF_LD|BPF_W|BPF_IND: - op = "ld"; - fmt = "[x + %d]"; - break; - - case BPF_LD|BPF_H|BPF_IND: - op = "ldh"; - fmt = "[x + %d]"; - break; - - case BPF_LD|BPF_B|BPF_IND: - op = "ldb"; - fmt = "[x + %d]"; - break; - - case BPF_LD|BPF_IMM: - op = "ld"; - fmt = "#0x%x"; - break; - - case BPF_LDX|BPF_IMM: - op = "ldx"; - fmt = "#0x%x"; - break; - - case BPF_LDX|BPF_MSH|BPF_B: - op = "ldxb"; - fmt = "4*([%d]&0xf)"; - break; - - case BPF_LD|BPF_MEM: - op = "ld"; - fmt = "M[%d]"; - break; - - case BPF_LDX|BPF_MEM: - op = "ldx"; - fmt = "M[%d]"; - break; - - case BPF_ST: - op = "st"; - fmt = "M[%d]"; - break; - - case BPF_STX: - op = "stx"; - fmt = "M[%d]"; - break; - - case BPF_JMP|BPF_JA: - op = "ja"; - fmt = "%d"; - v = n + 1 + p->k; - break; - - case BPF_JMP|BPF_JGT|BPF_K: - op = "jgt"; - fmt = "#0x%x"; - break; - - case BPF_JMP|BPF_JGE|BPF_K: - op = "jge"; - fmt = "#0x%x"; - break; - - case BPF_JMP|BPF_JEQ|BPF_K: - op = "jeq"; - fmt = "#0x%08x"; - break; - - case BPF_JMP|BPF_JSET|BPF_K: - op = "jset"; - fmt = "#0x%x"; - break; - - case BPF_JMP|BPF_JGT|BPF_X: - op = "jgt"; - fmt = "x"; - break; - - case BPF_JMP|BPF_JGE|BPF_X: - op = "jge"; - fmt = "x"; - break; - - case BPF_JMP|BPF_JEQ|BPF_X: - op = "jeq"; - fmt = "x"; - break; - - case BPF_JMP|BPF_JSET|BPF_X: - op = "jset"; - fmt = "x"; - break; - - case BPF_ALU|BPF_ADD|BPF_X: - op = "add"; - fmt = "x"; - break; - - case BPF_ALU|BPF_SUB|BPF_X: - op = "sub"; - fmt = "x"; - break; - - case BPF_ALU|BPF_MUL|BPF_X: - op = "mul"; - fmt = "x"; - break; - - case BPF_ALU|BPF_DIV|BPF_X: - op = "div"; - fmt = "x"; - break; - - case BPF_ALU|BPF_AND|BPF_X: - op = "and"; - fmt = "x"; - break; - - case BPF_ALU|BPF_OR|BPF_X: - op = "or"; - fmt = "x"; - break; - - case BPF_ALU|BPF_LSH|BPF_X: - op = "lsh"; - fmt = "x"; - break; - - case BPF_ALU|BPF_RSH|BPF_X: - op = "rsh"; - fmt = "x"; - break; - - case BPF_ALU|BPF_ADD|BPF_K: - op = "add"; - fmt = "#%d"; - break; - - case BPF_ALU|BPF_SUB|BPF_K: - op = "sub"; - fmt = "#%d"; - break; - - case BPF_ALU|BPF_MUL|BPF_K: - op = "mul"; - fmt = "#%d"; - break; - - case BPF_ALU|BPF_DIV|BPF_K: - op = "div"; - fmt = "#%d"; - break; - - case BPF_ALU|BPF_AND|BPF_K: - op = "and"; - fmt = "#0x%08x"; - break; - - case BPF_ALU|BPF_OR|BPF_K: - op = "or"; - fmt = "#0x%x"; - break; - - case BPF_ALU|BPF_LSH|BPF_K: - op = "lsh"; - fmt = "#%d"; - break; - - case BPF_ALU|BPF_RSH|BPF_K: - op = "rsh"; - fmt = "#%d"; - break; - - case BPF_ALU|BPF_NEG: - op = "neg"; - fmt = ""; - break; - - case BPF_MISC|BPF_TAX: - op = "tax"; - fmt = ""; - break; - - case BPF_MISC|BPF_TXA: - op = "txa"; - fmt = ""; - break; - } - (void)sprintf(operand, fmt, v); - (void)sprintf(image, - (BPF_CLASS(p->code) == BPF_JMP && - BPF_OP(p->code) != BPF_JA) ? - "(%03d) %-8s %-16s jt %d\tjf %d" - : "(%03d) %-8s %s", - n, op, operand, n + 1 + p->jt, n + 1 + p->jf); - return image; -} |