Author: jelmer
Date: 2006-04-08 13:43:57 +0000 (Sat, 08 Apr 2006)
New Revision: 14991

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=14991

Log:
Add option -l to allow ndrdump to load dcerpc_interface_tables from .so files.

Modified:
   branches/SAMBA_4_0/source/utils/ndrdump.c


Changeset:
Modified: branches/SAMBA_4_0/source/utils/ndrdump.c
===================================================================
--- branches/SAMBA_4_0/source/utils/ndrdump.c   2006-04-08 07:54:15 UTC (rev 
14990)
+++ branches/SAMBA_4_0/source/utils/ndrdump.c   2006-04-08 13:43:57 UTC (rev 
14991)
@@ -99,9 +99,35 @@
        return result;
 }
 
+const struct dcerpc_interface_table *load_iface_from_plugin(const char 
*plugin, const char *pipe_name)
+{
+       const struct dcerpc_interface_table *p;
+       void *handle;
+       char *symbol;
+
+       handle = dlopen(plugin, RTLD_NOW);
+       if (handle == NULL) {
+               printf("%s: Unable to open: %s\n", plugin, dlerror());
+               return NULL;
+       }
+
+       symbol = talloc_asprintf(NULL, "dcerpc_table_%s", pipe_name);
+       p = dlsym(handle, symbol);
+
+       if (!p) {
+               printf("%s: Unable to find DCE/RPC interface table for '%s': 
%s\n", plugin, pipe_name, dlerror());
+               talloc_free(symbol);
+               return NULL;
+       }
+
+       talloc_free(symbol);
+       
+       return p;
+}
+
  int main(int argc, const char *argv[])
 {
-       const struct dcerpc_interface_table *p;
+       const struct dcerpc_interface_table *p = NULL;
        const struct dcerpc_interface_call *f;
        const char *pipe_name, *function, *inout, *filename;
        uint8_t *data;
@@ -116,6 +142,7 @@
        void *st;
        void *v_st;
        const char *ctx_filename = NULL;
+       const char *plugin = NULL;
        BOOL validate = False;
        BOOL dumpdata = False;
        int opt;
@@ -123,6 +150,7 @@
                {"context-file", 'c', POPT_ARG_STRING, &ctx_filename, 0, 
"In-filename to parse first", "CTX-FILE" },
                {"validate", 0, POPT_ARG_NONE, &validate, 0, "try to validate 
the data", NULL },        
                {"dump-data", 0, POPT_ARG_NONE, &dumpdata, 0, "dump the hex 
data", NULL },      
+               {"load-dso", 'l', POPT_ARG_STRING, &plugin, 0, "load from 
shared object file", NULL },
                POPT_COMMON_SAMBA
                POPT_AUTOHELP
                POPT_TABLEEND
@@ -146,9 +174,15 @@
                exit(1);
        }
 
-       p = idl_iface_by_name(pipe_name);
+       if (plugin != NULL) {
+               p = load_iface_from_plugin(plugin, pipe_name);
+       }
 
        if (!p) {
+               p = idl_iface_by_name(pipe_name);
+       }
+
+       if (!p) {
                struct GUID uuid;
 
                status = GUID_from_string(pipe_name, &uuid);
@@ -156,11 +190,11 @@
                if (NT_STATUS_IS_OK(status)) {
                        p = idl_iface_by_uuid(&uuid);
                }
+       }
 
-               if (!p) {
-                       printf("Unknown pipe or UUID '%s'\n", pipe_name);
-                       exit(1);
-               }
+       if (!p) {
+               printf("Unknown pipe or UUID '%s'\n", pipe_name);
+               exit(1);
        }
 
        function = poptGetArg(pc);

Reply via email to