diff options
Diffstat (limited to 'source4/librpc/rpc')
-rw-r--r-- | source4/librpc/rpc/dcerpc.c | 19 | ||||
-rw-r--r-- | source4/librpc/rpc/dcerpc.h | 8 | ||||
-rw-r--r-- | source4/librpc/rpc/dcerpc_util.c | 38 |
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 */ |