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);