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