summaryrefslogtreecommitdiff
path: root/source4/librpc/rpc
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@samba.org>2005-12-27 17:15:48 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:47:49 -0500
commit0ad7b308a1c602ddab73668952cdf3837623b877 (patch)
tree45e44464d978c4f313274239d8e9d98dfc5fab43 /source4/librpc/rpc
parente748b53e4343fbac00a19e8fc76b42624eb5af02 (diff)
downloadsamba-0ad7b308a1c602ddab73668952cdf3837623b877.tar.gz
samba-0ad7b308a1c602ddab73668952cdf3837623b877.tar.bz2
samba-0ad7b308a1c602ddab73668952cdf3837623b877.zip
r12514: Move DCE/RPC interface table to a seperate file
Be a bit more strict when checking for duplicate interfaces (This used to be commit b1286a6d27e2b5aa26f288f6aff70601b0d8ae74)
Diffstat (limited to 'source4/librpc/rpc')
-rw-r--r--source4/librpc/rpc/dcerpc.c27
-rw-r--r--source4/librpc/rpc/dcerpc_util.c62
-rw-r--r--source4/librpc/rpc/table.c94
3 files changed, 106 insertions, 77 deletions
diff --git a/source4/librpc/rpc/dcerpc.c b/source4/librpc/rpc/dcerpc.c
index 14305c3449..9e585f9612 100644
--- a/source4/librpc/rpc/dcerpc.c
+++ b/source4/librpc/rpc/dcerpc.c
@@ -31,20 +31,25 @@
static void dcerpc_ship_next_request(struct dcerpc_connection *c);
-static struct dcerpc_interface_list *dcerpc_pipes = NULL;
+struct dcerpc_interface_list *dcerpc_pipes = NULL;
/*
register a dcerpc client interface
*/
NTSTATUS librpc_register_interface(const struct dcerpc_interface_table *interface)
{
- struct dcerpc_interface_list *l = talloc(talloc_autofree_context(),
- 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;
+ struct dcerpc_interface_list *l;
+
+ for (l = dcerpc_pipes; l; l = l->next) {
+ if (GUID_equal(&interface->uuid, &l->table->uuid)) {
+ DEBUG(0, ("Attempt to register interface %s which has the "
+ "same UUID as already registered interface %s\n",
+ interface->name, l->table->name));
+ return NT_STATUS_OBJECT_NAME_COLLISION;
+ }
}
+
+ l = talloc(talloc_autofree_context(), struct dcerpc_interface_list);
l->table = interface;
DLIST_ADD(dcerpc_pipes, l);
@@ -52,14 +57,6 @@ NTSTATUS librpc_register_interface(const struct dcerpc_interface_table *interfac
return NT_STATUS_OK;
}
-/*
- return the list of registered dcerpc_pipes
-*/
-const struct dcerpc_interface_list *librpc_dcerpc_pipes(void)
-{
- return dcerpc_pipes;
-}
-
/* destroy a dcerpc connection */
static int dcerpc_connection_destructor(void *ptr)
{
diff --git a/source4/librpc/rpc/dcerpc_util.c b/source4/librpc/rpc/dcerpc_util.c
index 4e7550c701..6e814bce3f 100644
--- a/source4/librpc/rpc/dcerpc_util.c
+++ b/source4/librpc/rpc/dcerpc_util.c
@@ -27,68 +27,6 @@
#include "librpc/gen_ndr/ndr_epmapper.h"
#include "librpc/gen_ndr/ndr_dcerpc.h"
#include "librpc/gen_ndr/ndr_misc.h"
-#include "libcli/raw/libcliraw.h"
-#include "libcli/composite/composite.h"
-#include "libcli/smb_composite/smb_composite.h"
-
-/*
- find the pipe name for a local IDL interface
-*/
-const char *idl_pipe_name(const struct GUID *uuid, uint32_t if_version)
-{
- const struct dcerpc_interface_list *l;
- for (l=librpc_dcerpc_pipes();l;l=l->next) {
- if (GUID_equal(&l->table->uuid, uuid) &&
- l->table->if_version == if_version) {
- return l->table->name;
- }
- }
- return "UNKNOWN";
-}
-
-/*
- find the number of calls defined by local IDL
-*/
-int idl_num_calls(const struct GUID *uuid, uint32_t if_version)
-{
- const struct dcerpc_interface_list *l;
- for (l=librpc_dcerpc_pipes();l;l=l->next){
- if (GUID_equal(&l->table->uuid, uuid) &&
- l->table->if_version == if_version) {
- return l->table->num_calls;
- }
- }
- return -1;
-}
-
-
-/*
- find a dcerpc interface by name
-*/
-const struct dcerpc_interface_table *idl_iface_by_name(const char *name)
-{
- const struct dcerpc_interface_list *l;
- for (l=librpc_dcerpc_pipes();l;l=l->next) {
- if (strcasecmp(l->table->name, name) == 0) {
- return l->table;
- }
- }
- return NULL;
-}
-
-/*
- find a dcerpc interface by uuid
-*/
-const struct dcerpc_interface_table *idl_iface_by_uuid(const struct GUID *uuid)
-{
- const struct dcerpc_interface_list *l;
- for (l=librpc_dcerpc_pipes();l;l=l->next) {
- if (GUID_equal(&l->table->uuid, uuid)) {
- return l->table;
- }
- }
- return NULL;
-}
/*
find a dcerpc call on an interface by name
diff --git a/source4/librpc/rpc/table.c b/source4/librpc/rpc/table.c
new file mode 100644
index 0000000000..5450edb003
--- /dev/null
+++ b/source4/librpc/rpc/table.c
@@ -0,0 +1,94 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ dcerpc utility functions
+
+ Copyright (C) Andrew Tridgell 2003
+ Copyright (C) Jelmer Vernooij 2004
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "includes.h"
+
+/*
+ find the pipe name for a local IDL interface
+*/
+const char *idl_pipe_name(const struct GUID *uuid, uint32_t if_version)
+{
+ const struct dcerpc_interface_list *l;
+ for (l=librpc_dcerpc_pipes();l;l=l->next) {
+ if (GUID_equal(&l->table->uuid, uuid) &&
+ l->table->if_version == if_version) {
+ return l->table->name;
+ }
+ }
+ return "UNKNOWN";
+}
+
+/*
+ find the number of calls defined by local IDL
+*/
+int idl_num_calls(const struct GUID *uuid, uint32_t if_version)
+{
+ const struct dcerpc_interface_list *l;
+ for (l=librpc_dcerpc_pipes();l;l=l->next){
+ if (GUID_equal(&l->table->uuid, uuid) &&
+ l->table->if_version == if_version) {
+ return l->table->num_calls;
+ }
+ }
+ return -1;
+}
+
+
+/*
+ find a dcerpc interface by name
+*/
+const struct dcerpc_interface_table *idl_iface_by_name(const char *name)
+{
+ const struct dcerpc_interface_list *l;
+ for (l=librpc_dcerpc_pipes();l;l=l->next) {
+ if (strcasecmp(l->table->name, name) == 0) {
+ return l->table;
+ }
+ }
+ return NULL;
+}
+
+/*
+ find a dcerpc interface by uuid
+*/
+const struct dcerpc_interface_table *idl_iface_by_uuid(const struct GUID *uuid)
+{
+ const struct dcerpc_interface_list *l;
+ for (l=librpc_dcerpc_pipes();l;l=l->next) {
+ if (GUID_equal(&l->table->uuid, uuid)) {
+ return l->table;
+ }
+ }
+ return NULL;
+}
+
+extern struct dcerpc_interface_list *dcerpc_pipes;
+/*
+ return the list of registered dcerpc_pipes
+*/
+const struct dcerpc_interface_list *librpc_dcerpc_pipes(void)
+{
+ return dcerpc_pipes;
+}
+
+