Extend cpp_exec function with args parameter to
specify additional cpp options (like -D).

Signed-off-by: Vadim Kochan <[email protected]>
---
 bpf_parser.y     |  2 +-
 cpp.c            | 38 +++++++++++++++++++++++++++++---------
 cpp.h            |  2 +-
 trafgen_parser.y |  2 +-
 4 files changed, 32 insertions(+), 12 deletions(-)

diff --git a/bpf_parser.y b/bpf_parser.y
index 003c031..7331cc5 100644
--- a/bpf_parser.y
+++ b/bpf_parser.y
@@ -745,7 +745,7 @@ int compile_filter(char *file, int verbose, int bypass, int 
format,
        memset(tmp_file, 0, sizeof(tmp_file));
 
        if (invoke_cpp) {
-               ret = cpp_exec(file, tmp_file, sizeof(tmp_file));
+               ret = cpp_exec(file, tmp_file, sizeof(tmp_file), NULL);
                if (ret) {
                        fprintf(stderr, "Failed to invoke C preprocessor!\n");
                        goto exit;
diff --git a/cpp.c b/cpp.c
index d4ec2a6..44dfe47 100644
--- a/cpp.c
+++ b/cpp.c
@@ -5,25 +5,45 @@
 #include "proc.h"
 #include "xmalloc.h"
 
-int cpp_exec(char *in_file, char *out_file, size_t out_len)
+static size_t argv_len(char **argv) {
+       size_t len = 0;
+
+       for (; argv && *argv; argv++)
+               len++;
+
+       return len;
+}
+
+int cpp_exec(char *in_file, char *out_file, size_t out_len, char **argv)
 {
+       size_t argc = 7 + argv_len(argv);
        char *tmp = xstrdup(in_file);
-       char *argv[7] = {
-               "cpp",
-               "-I", ETCDIRE_STRING,
-               "-o", out_file,
-               in_file,
-               NULL,
-       };
+       char **cpp_argv;
        int ret = 0;
        char *base;
+       int i = 0;
 
        base = basename(tmp);
        slprintf(out_file, out_len, "/tmp/.tmp-%u-%s", rand(), base);
 
-       if (proc_exec("cpp", argv))
+       cpp_argv = xmalloc(argc * sizeof(char *));
+
+       cpp_argv[i++] = "cpp";
+
+       for (; argv && *argv; argv++, i++)
+               cpp_argv[i] = *argv;
+
+       cpp_argv[i++] = "-I";
+       cpp_argv[i++] = ETCDIRE_STRING;
+       cpp_argv[i++] = "-o";
+       cpp_argv[i++] = out_file;
+       cpp_argv[i++] = in_file;
+       cpp_argv[i++] = NULL;
+
+       if (proc_exec("cpp", cpp_argv))
                ret = -1;
 
+       xfree(cpp_argv);
        xfree(tmp);
        return ret;
 }
diff --git a/cpp.h b/cpp.h
index a3e295d..ef19714 100644
--- a/cpp.h
+++ b/cpp.h
@@ -1,6 +1,6 @@
 #ifndef CPP_H
 #define CPP_H
 
-extern int cpp_exec(char *in_file, char *out_file, size_t out_len);
+extern int cpp_exec(char *in_file, char *out_file, size_t out_len, char 
**args);
 
 #endif
diff --git a/trafgen_parser.y b/trafgen_parser.y
index 44751ab..8a0f3b7 100644
--- a/trafgen_parser.y
+++ b/trafgen_parser.y
@@ -599,7 +599,7 @@ void compile_packets(char *file, bool verbose, unsigned int 
cpu, bool invoke_cpp
        our_cpu = cpu;
 
        if (invoke_cpp) {
-               if (cpp_exec(file, tmp_file, sizeof(tmp_file))) {
+               if (cpp_exec(file, tmp_file, sizeof(tmp_file), NULL)) {
                        fprintf(stderr, "Failed to invoke C preprocessor!\n");
                        goto err;
                }
-- 
2.6.3

-- 
You received this message because you are subscribed to the Google Groups 
"netsniff-ng" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to