svn commit: samba r14991 - in branches/SAMBA_4_0/source/utils: .
jelmer at samba.org
jelmer at samba.org
Sat Apr 8 13:43:57 GMT 2006
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);
More information about the samba-cvs
mailing list