summaryrefslogtreecommitdiff
path: root/source4/librpc/rpc
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@samba.org>2004-11-16 21:07:08 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:05:53 -0500
commit46badf19089668e470e9bb5b2300017f8948b49e (patch)
tree5625999d4333c30f6cedce7cbfc73ced1b2791ef /source4/librpc/rpc
parent83d29e9bac43f643eb4ab11871425019f2ea9421 (diff)
downloadsamba-46badf19089668e470e9bb5b2300017f8948b49e.tar.gz
samba-46badf19089668e470e9bb5b2300017f8948b49e.tar.bz2
samba-46badf19089668e470e9bb5b2300017f8948b49e.zip
r3790: use a registration function that is called from dcerpc_*_init functions
rather then a large table in librpc/gen_ndr/tables.c. This will allow us to only link in only the required gen_ndr files (speeds up linking quite a bit, makes binaries smaller). Each gen_ndr_* file now has a init function that calls the init functions of the interfaces it contains. I did it this way to keep pidl's code simple, though it might hurt startup time a bit. I'd be happy to change it if people like one function better. (This used to be commit 3c436590ae95b58ad6d00e72d6fdd08a4d80f208)
Diffstat (limited to 'source4/librpc/rpc')
-rw-r--r--source4/librpc/rpc/dcerpc.c19
-rw-r--r--source4/librpc/rpc/dcerpc.h8
-rw-r--r--source4/librpc/rpc/dcerpc_util.c38
3 files changed, 41 insertions, 24 deletions
diff --git a/source4/librpc/rpc/dcerpc.c b/source4/librpc/rpc/dcerpc.c
index f4b10f6b52..2427a22e59 100644
--- a/source4/librpc/rpc/dcerpc.c
+++ b/source4/librpc/rpc/dcerpc.c
@@ -24,12 +24,23 @@
#include "dlinklist.h"
#include "librpc/gen_ndr/ndr_epmapper.h"
-NTSTATUS librpc_init(void)
+struct dcerpc_interface_list *dcerpc_pipes = NULL;
+
+NTSTATUS librpc_register_interface (const struct dcerpc_interface_table *interface)
{
- /* FIXME: Register module registration function here */
- return NT_STATUS_OK;
+ struct dcerpc_interface_list *l = talloc_p(NULL, struct dcerpc_interface_list);
+
+ if (idl_iface_by_name (interface->name) != NULL) {
+ DEBUG(0, ("Attempt to register interface %s twice\n", interface->name));
+ return NT_STATUS_OBJECT_NAME_COLLISION;
+ }
+ l->table = interface;
+
+ DLIST_ADD(dcerpc_pipes, l);
+
+ return NT_STATUS_OK;
}
-
+
/* initialise a dcerpc pipe. */
struct dcerpc_pipe *dcerpc_pipe_init(void)
{
diff --git a/source4/librpc/rpc/dcerpc.h b/source4/librpc/rpc/dcerpc.h
index 31444e9dba..47f13e643d 100644
--- a/source4/librpc/rpc/dcerpc.h
+++ b/source4/librpc/rpc/dcerpc.h
@@ -141,6 +141,14 @@ struct dcerpc_interface_table {
const struct dcerpc_endpoint_list *endpoints;
};
+struct dcerpc_interface_list
+{
+ struct dcerpc_interface_list *prev, *next;
+ const struct dcerpc_interface_table *table;
+};
+
+extern struct dcerpc_interface_list *dcerpc_pipes;
+
/* this describes a binding to a particular transport/pipe */
struct dcerpc_binding {
diff --git a/source4/librpc/rpc/dcerpc_util.c b/source4/librpc/rpc/dcerpc_util.c
index c31cf2791b..5c824cec99 100644
--- a/source4/librpc/rpc/dcerpc_util.c
+++ b/source4/librpc/rpc/dcerpc_util.c
@@ -24,18 +24,17 @@
#include "includes.h"
#include "system/network.h"
#include "librpc/gen_ndr/ndr_epmapper.h"
-#include "librpc/gen_ndr/tables.h"
/*
find the pipe name for a local IDL interface
*/
const char *idl_pipe_name(const char *uuid, uint32_t if_version)
{
- int i;
- for (i=0;dcerpc_pipes[i];i++) {
- if (strcasecmp(dcerpc_pipes[i]->uuid, uuid) == 0 &&
- dcerpc_pipes[i]->if_version == if_version) {
- return dcerpc_pipes[i]->name;
+ struct dcerpc_interface_list *l;
+ for (l=dcerpc_pipes;l;l=l->next) {
+ if (strcasecmp(l->table->uuid, uuid) == 0 &&
+ l->table->if_version == if_version) {
+ return l->table->name;
}
}
return "UNKNOWN";
@@ -46,11 +45,11 @@ const char *idl_pipe_name(const char *uuid, uint32_t if_version)
*/
int idl_num_calls(const char *uuid, uint32_t if_version)
{
- int i;
- for (i=0;dcerpc_pipes[i];i++) {
- if (strcasecmp(dcerpc_pipes[i]->uuid, uuid) == 0 &&
- dcerpc_pipes[i]->if_version == if_version) {
- return dcerpc_pipes[i]->num_calls;
+ struct dcerpc_interface_list *l;
+ for (l=dcerpc_pipes;l;l=l->next){
+ if (strcasecmp(l->table->uuid, uuid) == 0 &&
+ l->table->if_version == if_version) {
+ return l->table->num_calls;
}
}
return -1;
@@ -62,10 +61,10 @@ int idl_num_calls(const char *uuid, uint32_t if_version)
*/
const struct dcerpc_interface_table *idl_iface_by_name(const char *name)
{
- int i;
- for (i=0;dcerpc_pipes[i];i++) {
- if (strcasecmp(dcerpc_pipes[i]->name, name) == 0) {
- return dcerpc_pipes[i];
+ struct dcerpc_interface_list *l;
+ for (l=dcerpc_pipes;l;l=l->next) {
+ if (strcasecmp(l->table->name, name) == 0) {
+ return l->table;
}
}
return NULL;
@@ -76,17 +75,16 @@ const struct dcerpc_interface_table *idl_iface_by_name(const char *name)
*/
const struct dcerpc_interface_table *idl_iface_by_uuid(const char *uuid)
{
- int i;
- for (i=0;dcerpc_pipes[i];i++) {
- if (strcasecmp(dcerpc_pipes[i]->uuid, uuid) == 0) {
- return dcerpc_pipes[i];
+ struct dcerpc_interface_list *l;
+ for (l=dcerpc_pipes;l;l=l->next) {
+ if (strcasecmp(l->table->uuid, uuid) == 0) {
+ return l->table;
}
}
return NULL;
}
-
/*
push a dcerpc_packet into a blob, potentially with auth info
*/