summaryrefslogtreecommitdiff
path: root/bpf_parser.y
diff options
context:
space:
mode:
Diffstat (limited to 'bpf_parser.y')
-rw-r--r--bpf_parser.y30
1 files changed, 28 insertions, 2 deletions
diff --git a/bpf_parser.y b/bpf_parser.y
index 459ea99..7734fb3 100644
--- a/bpf_parser.y
+++ b/bpf_parser.y
@@ -16,16 +16,19 @@
#include <signal.h>
#include <stdint.h>
#include <errno.h>
+#include <libgen.h>
#include "bpf.h"
#include "xmalloc.h"
#include "bpf_parser.tab.h"
#include "built_in.h"
#include "die.h"
+#include "xutils.h"
#define MAX_INSTRUCTIONS 4096
-int compile_filter(char *file, int verbose, int bypass, int format);
+int compile_filter(char *file, int verbose, int bypass, int format,
+ bool invoke_cpp);
static int curr_instr = 0;
@@ -659,10 +662,30 @@ static void pretty_printer(const struct sock_fprog *prog, int format)
}
}
-int compile_filter(char *file, int verbose, int bypass, int format)
+int compile_filter(char *file, int verbose, int bypass, int format,
+ bool invoke_cpp)
{
int i;
struct sock_fprog res;
+ char tmp_file[128];
+
+ memset(tmp_file, 0, sizeof(tmp_file));
+
+ if (invoke_cpp) {
+ char cmd[256], *dir, *base, *a, *b;
+
+ dir = dirname((a = xstrdup(file)));
+ base = basename((b = xstrdup(file)));
+
+ slprintf(tmp_file, sizeof(tmp_file), "%s/.tmp-%u-%s", dir, rand(), base);
+ slprintf(cmd, sizeof(cmd), "cpp -I" PREFIX_STRING
+ "/etc/netsniff-ng/ %s > %s", file, tmp_file);
+ system(cmd);
+
+ file = tmp_file;
+ xfree(a);
+ xfree(b);
+ }
if (!strncmp("-", file, strlen("-")))
yyin = stdin;
@@ -718,6 +741,9 @@ int compile_filter(char *file, int verbose, int bypass, int format)
}
fclose(yyin);
+ if (invoke_cpp)
+ unlink(tmp_file);
+
return 0;
}