This makes parsing options less complicated and easier to extend.

v2: Fix device id parsing (atoi -> sscanf) (Sirisha)
    Combine with previous commit moving init function (Sirisha)

v3: Fix behavior change between bash 4.3 & 4.4 in <<< with \n characters
    (Lionel)

Signed-off-by: Lionel Landwerlin <lionel.g.landwer...@intel.com>
---
 tools/aubdump.c        | 58 ++++++++++++++++++++++++++++++++++++--------------
 tools/intel_aubdump.in | 24 +++++++++++++++------
 2 files changed, 59 insertions(+), 23 deletions(-)

diff --git a/tools/aubdump.c b/tools/aubdump.c
index 30dc742..f2cd2c1 100644
--- a/tools/aubdump.c
+++ b/tools/aubdump.c
@@ -426,6 +426,46 @@ close(int fd)
        return libc_close(fd);
 }

+static void
+maybe_init(void)
+{
+       static bool initialized = false;
+       FILE *config;
+       char *key, *value;
+
+       if (initialized)
+               return;
+
+       initialized = true;
+
+       config = fdopen(3, "r");
+       while (fscanf(config, "%m[^=]=%m[^\n]\n", &key, &value) != EOF) {
+               if (!strcmp(key, "verbose")) {
+                       verbose = 1;
+               } else if (!strcmp(key, "device")) {
+                       fail_if(sscanf(value, "%i", &device) != 1,
+                               "intel_aubdump: failed to parse device id '%s'",
+                               value);
+                       device_override = true;
+               } else if (!strcmp(key, "file")) {
+                       filename = value;
+                       file = fopen(filename, "w+");
+                       fail_if(file == NULL,
+                               "intel_aubdump: failed to open file '%s'\n",
+                               filename);
+               } else {
+                       fprintf(stderr, "intel_aubdump: unknown option '%s'\n", 
key);
+               }
+
+               free(key);
+               free(value);
+       }
+       fclose(config);
+
+       bos = malloc(MAX_BO_COUNT * sizeof(bos[0]));
+       fail_if(bos == NULL, "intel_aubdump: out of memory\n");
+}
+
 int
 ioctl(int fd, unsigned long request, ...)
 {
@@ -447,6 +487,8 @@ ioctl(int fd, unsigned long request, ...)
        }

        if (fd == drm_fd) {
+               maybe_init();
+
                switch (request) {
                case DRM_IOCTL_I915_GETPARAM: {
                        struct drm_i915_getparam *getparam = argp;
@@ -550,26 +592,10 @@ ioctl(int fd, unsigned long request, ...)
 static void
 init(void)
 {
-       const char *args = getenv("INTEL_AUBDUMP_ARGS");
-
        libc_close = dlsym(RTLD_NEXT, "close");
        libc_ioctl = dlsym(RTLD_NEXT, "ioctl");
        fail_if(libc_close == NULL || libc_ioctl == NULL,
                "intel_aubdump: failed to get libc ioctl or close\n");
-
-       if (sscanf(args, "verbose=%d;file=%m[^;];device=%i",
-                  &verbose, &filename, &device) != 3)
-               filename = strdup("intel.aub");
-       fail_if(filename == NULL, "intel_aubdump: out of memory\n");
-
-       if (device)
-               device_override = true;
-
-       bos = malloc(MAX_BO_COUNT * sizeof(bos[0]));
-       fail_if(bos == NULL, "intel_aubdump: out of memory\n");
-
-       file = fopen(filename, "w+");
-       fail_if(file == NULL, "intel_aubdump: failed to open file '%s'\n", 
filename);
 }

 static int
diff --git a/tools/intel_aubdump.in b/tools/intel_aubdump.in
index feee23a..18fd03b 100644
--- a/tools/intel_aubdump.in
+++ b/tools/intel_aubdump.in
@@ -21,29 +21,38 @@ EOF
     exit 0
 }

-verbose=0
-device=0
+args=""
+command=""
+file=""
+
+function add_arg() {
+    arg=$1
+    args="$args$arg\n"
+}

 while true; do
       case "$1" in
          -o)
              file=$2
+             add_arg "file=${f:-$(basename ${f}).aub}"
              shift 2
              ;;
          -v)
-             verbose=1
+             add_arg "verbose=1"
              shift 1
              ;;
          -o*)
              file=${1##-o}
+             add_arg "file=${file:-$(basename ${file}).aub}"
              shift
              ;;
          --output=*)
              file=${1##--output=}
+             add_arg "file=${file:-$(basename ${file}).aub}"
              shift
              ;;
          --device=*)
-             device=${1##--device=}
+             add_arg "device=${1##--device=}"
              shift
              ;;
          --help)
@@ -66,12 +75,13 @@ done

 [ -z $1 ] && show_help

-file=${file:-$(basename $1).aub}
+[ -z $file ] && add_arg "file=intel.aub"

 prefix=@prefix@
 exec_prefix=@exec_prefix@
 libdir=@libdir@

 LD_PRELOAD=${libdir}/intel_aubdump.so${LD_PPRELOAD:+:${LD_PRELOAD}} \
-         INTEL_AUBDUMP_ARGS="verbose=$verbose;file=$file;device=$device" \
-         exec -- "$@"
+         exec -- "$@" 3<<EOF
+`echo -e $args`
+EOF
--
2.10.2
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to