]> granicus.if.org Git - strace/commitdiff
fully decode the query_module syscall
authorWichert Akkerman <wichert@deephackmode.org>
Sat, 27 Nov 1999 21:58:20 +0000 (21:58 +0000)
committerWichert Akkerman <wichert@deephackmode.org>
Sat, 27 Nov 1999 21:58:20 +0000 (21:58 +0000)
ChangeLog
bjm.c

index c785258a9be6dc1524e765fc5cf8def7c8c3084a..6f745ff0ac69e0f921ca8ac288f2db2e392b75ae 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Sat Nov 27 21:38:17 CET 1999 Wichert Akkerman <wakkerma@debian.org>
+
+  * Enhance sys_query_module
+
 Fri Nov 26 10:51:55 CET 1999 Wichert Akkerman <wakkerma@debian.org>
 
   * Patches from John Hughes:
diff --git a/bjm.c b/bjm.c
index cf7f4e87650074fc6ae26cacd4e6f2a227424758..76139b5ef8c8a1c72aef5890d829903a1f898b99 100644 (file)
--- a/bjm.c
+++ b/bjm.c
 #include <signal.h>
 #include <linux/module.h>
 
-/* WTA: #define these here: since Debian uses glibc2's includefiles
- * instead of the kernel includes we miss these otherwise.
- */
-
 #if !defined(QM_MODULES)
 #define QM_MODULES     1
 #define QM_DEPS                2
 #endif
 
 static struct xlat which[] = {
-       { 0,                    "0"                             },
+       { 0,            "0"             },
        { QM_MODULES,   "QM_MODULES"    },
-       { QM_DEPS,              "QM_DEPS"               },
-       { QM_REFS,              "QM_REFS"               },
+       { QM_DEPS,      "QM_DEPS"       },
+       { QM_REFS,      "QM_REFS"       },
        { QM_SYMBOLS,   "QM_SYMBOLS"    },
-       { QM_INFO,              "QM_INFO"               },
+       { QM_INFO,      "QM_INFO"       },
+       { 0,            NULL            },
+};
+
+static struct xlat modflags[] = {
+       { MOD_UNINITIALIZED,    "MOD_UNINITIALIZED"     },
+       { MOD_RUNNING,          "MOD_RUNNING"           },
+       { MOD_DELETED,          "MOD_DELETED"           },
+       { MOD_AUTOCLEAN,        "MOD_AUTOCLEAN"         },
+       { MOD_VISITED,          "MOD_VISITED"           },
+       { MOD_USED_ONCE,        "MOD_USED_ONCE"         },
+       { MOD_JUST_FREED,       "MOD_JUST_FREED"        },
        { 0,                    NULL                    },
 };
 
+void
+printstringlist(addr,num)
+char* addr;
+int num;
+{
+       int first;
+
+       first=1;
+       tprintf("{");
+       while (num--) {
+               if (first)
+                       first=0;
+               else
+                       tprintf(",");
+               tprintf(addr);
+               addr+=strlen(addr)+1;
+       }
+       tprintf("}");
+}
+
+
 int
 sys_query_module(tcp)
 struct tcb *tcp;
@@ -43,10 +71,58 @@ struct tcb *tcp;
        if (exiting(tcp)) {
                printstr(tcp, tcp->u_arg[0], -1);
                tprintf(", ");
-               printxval(which, tcp->u_arg[1], "L_???");
+               printxval(which, tcp->u_arg[1], "QM_???");
                tprintf(", ");
-               printstr(tcp, tcp->u_arg[2], tcp->u_arg[3]);
-               tprintf(", %#lx", tcp->u_arg[4]);
+               if (tcp->u_rval!=0) {
+                       size_t  ret;
+                       umove(tcp, tcp->u_arg[4], &ret);
+                       tprintf("%#lx, %lu, %d", tcp->u_arg[2], tcp->u_arg[3], ret);
+               } else if (tcp->u_arg[1]==QM_INFO) {
+                       struct module_info      mi;
+                       size_t                  ret;
+                       umove(tcp, tcp->u_arg[2], &mi);
+                       tprintf("{address=%#lx, size=%lu, flags=", mi.addr, mi.size);
+                       printflags(modflags, mi.flags);
+                       tprintf(", usecount=%lu}", mi.usecount);
+                       umove(tcp, tcp->u_arg[4], &ret);
+                       tprintf(", %d", ret);
+               } else if ((tcp->u_arg[1]==QM_MODULES) ||
+                               (tcp->u_arg[1]==QM_DEPS) ||
+                               (tcp->u_arg[1]==QM_REFS)) {
+                       char*   data    = (char*)malloc(tcp->u_arg[3]);
+                       char*   mod     = data;
+                       size_t  ret;
+                       int     first   = 0;
+
+                       umoven(tcp, tcp->u_arg[2], tcp->u_arg[3], data);
+                       umove(tcp, tcp->u_arg[4], &ret);
+                       tprintf("{");
+                       while (ret--) {
+                               if (first)
+                                       first=0;
+                               else
+                                       tprintf(",");
+                               tprintf(mod);
+                               mod+=strlen(mod)+1;
+                       }
+                       tprintf("}, %d", ret);
+                       free(data);
+               } else if (tcp->u_arg[1]==QM_SYMBOLS) {
+                       char*                   data    = (char *)malloc(tcp->u_arg[3]);
+                       struct module_symbol*   sym     = (struct module_symbol*)data;
+                       size_t                  ret;
+                       umoven(tcp, tcp->u_arg[2], tcp->u_arg[3], data);
+                       tprintf("{");
+                       while (ret--) {
+                               tprintf("{name=%#lx, value=%lu} ", sym->name, sym->value);
+                               sym++;
+                       }
+                       tprintf("}, %d", ret);
+                       free(data);
+               } else {
+                       printstr(tcp, tcp->u_arg[2], tcp->u_arg[3]);
+                       tprintf(", %#lx", tcp->u_arg[4]);
+               }
        }
        return 0;
 }