summaryrefslogtreecommitdiff
path: root/source4/lib/dcom/common
diff options
context:
space:
mode:
Diffstat (limited to 'source4/lib/dcom/common')
-rw-r--r--source4/lib/dcom/common/dcom.h33
-rw-r--r--source4/lib/dcom/common/main.c120
-rw-r--r--source4/lib/dcom/common/rot.c34
-rw-r--r--source4/lib/dcom/common/tables.c107
4 files changed, 16 insertions, 278 deletions
diff --git a/source4/lib/dcom/common/dcom.h b/source4/lib/dcom/common/dcom.h
index 0bc4a256f1..dd21bb9d29 100644
--- a/source4/lib/dcom/common/dcom.h
+++ b/source4/lib/dcom/common/dcom.h
@@ -1,7 +1,7 @@
/*
Unix SMB/CIFS implementation.
DCOM standard objects
- Copyright (C) Jelmer Vernooij 2004.
+ Copyright (C) Jelmer Vernooij 2004-2005.
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
@@ -23,11 +23,6 @@
#include "librpc/ndr/ndr_dcom.h"
-struct IUnknown_AddRef;
-struct IUnknown_Release;
-struct IUnknown_QueryInterface;
-struct dcom_interface_p;
-
struct dcom_context
{
struct dcom_object_exporter {
@@ -49,34 +44,16 @@ struct dcom_context
uint32_t dcerpc_flags;
};
-/* Specific implementation of one or more interfaces */
-struct dcom_class
-{
- const char *prog_id;
- struct GUID clsid;
-
- /* IUnknown */
- struct dcom_interface_p *class_object;
-};
-
-struct dcom_interface
-{
- struct GUID iid;
- int num_methods;
- struct GUID base_iid;
- const void *proxy_vtable;
-};
-
struct dcom_interface_p
{
- struct dcom_context *ctx;
- const struct dcom_interface *interface;
+ struct com_context *ctx;
+ const struct com_interface *interface;
const void *vtable; /* Points to one of the available implementations */
struct GUID ipid;
- struct dcom_object *object;
+ struct com_object *object;
int objref_flags;
int orpc_flags;
- struct dcom_object_exporter *ox;
+ struct com_object_exporter *ox;
uint32_t private_references;
};
diff --git a/source4/lib/dcom/common/main.c b/source4/lib/dcom/common/main.c
index a8324606f1..315912ba3c 100644
--- a/source4/lib/dcom/common/main.c
+++ b/source4/lib/dcom/common/main.c
@@ -117,7 +117,7 @@ WERROR dcom_init(struct dcom_context **ctx, const char *domain, const char *user
return WERR_OK;
}
-static struct dcom_object_exporter *oxid_mapping_by_oxid (struct dcom_context *ctx, uint64_t oxid)
+struct dcom_object_exporter *oxid_mapping_by_oxid (struct dcom_context *ctx, uint64_t oxid)
{
struct dcom_object_exporter *m;
@@ -144,7 +144,7 @@ WERROR dcom_ping(struct dcom_context *ctx)
return WERR_OK;
}
-static WERROR dcom_create_object_remote(struct dcom_context *ctx, struct GUID *clsid, const char *server, int num_ifaces, struct GUID *iid, struct dcom_interface_p ***ip, WERROR *results)
+static WERROR dcom_create_object(struct dcom_context *ctx, struct GUID *clsid, const char *server, int num_ifaces, struct GUID *iid, struct dcom_interface_p ***ip, WERROR *results)
{
uint16_t protseq[] = DCOM_NEGOTIATED_PROTOCOLS;
struct dcerpc_pipe *p;
@@ -154,6 +154,10 @@ static WERROR dcom_create_object_remote(struct dcom_context *ctx, struct GUID *c
struct DUALSTRINGARRAY dualstring;
int i;
+ if (!server) {
+ return com_create_object(ctx, clsid, num_ifaces, iid, ip, results);
+ }
+
status = dcom_connect_host(ctx, &p, server);
if (NT_STATUS_IS_ERR(status)) {
DEBUG(1, ("Unable to connect to %s - %s\n", server, nt_errstr(status)));
@@ -208,60 +212,7 @@ static WERROR dcom_create_object_remote(struct dcom_context *ctx, struct GUID *c
return WERR_OK;
}
-WERROR dcom_create_object(struct dcom_context *ctx, struct GUID *clsid, const char *server, int num_ifaces, struct GUID *iid, struct dcom_interface_p ***ip, WERROR *results)
-{
- struct dcom_interface_p *factory, *iunk = NULL;
- struct QueryInterface qr;
- struct Release rr;
- struct CreateInstance cr;
- WERROR error;
- int i;
- NTSTATUS status;
-
- if (server != NULL) {
- return dcom_create_object_remote(ctx, clsid, server, num_ifaces, iid, ip, results);
- }
-
- /* Obtain class object */
- error = dcom_get_class_object(ctx, clsid, server, iid, &factory);
- if (!W_ERROR_IS_OK(error)) {
- DEBUG(3, ("Unable to obtain class object for %s\n", GUID_string(NULL, clsid)));
- return error;
- }
-
- dcom_OBJREF_from_ifacep(ctx, &cr.in.pUnknown->obj, factory);
-
- GUID_from_string(DCERPC_ICLASSFACTORY_UUID, cr.in.iid);
-
- /* Run IClassFactory::CreateInstance() */
- status = dcom_IClassFactory_CreateInstance(factory, ctx, &cr);
- if (NT_STATUS_IS_ERR(status)) {
- DEBUG(3, ("Error while calling IClassFactory::CreateInstance : %s\n", nt_errstr(status)));
- return ntstatus_to_werror(status);
- }
-
- /* Release class object */
- status = dcom_IUnknown_Release(factory, ctx, &rr);
- if (NT_STATUS_IS_ERR(status)) {
- DEBUG(3, ("Error freeing class factory: %s\n", nt_errstr(status)));
- return ntstatus_to_werror(status);
- }
-
- /* Do one or more QueryInterface calls */
- for (i = 0; i < num_ifaces; i++) {
- qr.in.iid = &iid[i];
- status = dcom_IUnknown_QueryInterface(iunk, ctx, &qr);
- if (NT_STATUS_IS_ERR(status)) {
- DEBUG(4, ("Error obtaining interface %s : %s\n", GUID_string(NULL, &iid[i]), nt_errstr(status)));
- return ntstatus_to_werror(status);
- }
- results[i] = qr.out.result;
- }
-
- return WERR_OK;
-}
-
-WERROR dcom_get_class_object_remote(struct dcom_context *ctx, struct GUID *clsid, const char *server, struct GUID *iid, struct dcom_interface_p **ip)
+WERROR dcom_get_class_object(struct dcom_context *ctx, struct GUID *clsid, const char *server, struct GUID *iid, struct dcom_interface_p **ip)
{
struct dcom_object_exporter *m;
struct RemoteActivation r;
@@ -271,6 +222,10 @@ WERROR dcom_get_class_object_remote(struct dcom_context *ctx, struct GUID *clsid
struct pMInterfacePointer pm;
uint16_t protseq[] = DCOM_NEGOTIATED_PROTOCOLS;
+ if (!server) {
+ return com_get_class_object(ctx, clsid, iid, ip);
+ }
+
status = dcom_connect_host(ctx, &p, server);
if (NT_STATUS_IS_ERR(status)) {
DEBUG(1, ("Unable to connect to %s - %s\n", server, nt_errstr(status)));
@@ -312,36 +267,6 @@ WERROR dcom_get_class_object_remote(struct dcom_context *ctx, struct GUID *clsid
return WERR_OK;
}
-WERROR dcom_get_class_object(struct dcom_context *ctx, struct GUID *clsid, const char *server, struct GUID *iid, struct dcom_interface_p **ip)
-{
- const struct dcom_class *c;
- struct QueryInterface qi;
- NTSTATUS status;
-
- if (server != NULL) {
- return dcom_get_class_object_remote(ctx, clsid, server, iid, ip);
- }
-
- c = dcom_class_by_clsid(clsid);
- if (!c) {
- /* FIXME: Better error code.. */
- return WERR_DEST_NOT_FOUND;
- }
-
- qi.in.iid = iid;
-
- status = dcom_IUnknown_QueryInterface(c->class_object, ctx, &qi );
- if (NT_STATUS_IS_ERR(status)) {
- return ntstatus_to_werror(status);
- }
-
- if (!W_ERROR_IS_OK(qi.out.result)) { return qi.out.result; }
-
- dcom_ifacep_from_OBJREF(ctx, ip, &qi.out.data->obj);
-
- return WERR_OK;
-}
-
NTSTATUS dcom_get_pipe (struct dcom_interface_p *iface, struct dcerpc_pipe **pp)
{
struct dcerpc_binding binding;
@@ -549,26 +474,3 @@ uint64_t dcom_get_current_oxid(void)
{
return getpid();
}
-
-struct dcom_interface_p *dcom_new_local_ifacep(struct dcom_context *ctx, const struct GUID *iid, void *vtable, struct dcom_object *object)
-{
- struct dcom_interface_p *ip = talloc(ctx, struct dcom_interface_p);
- const struct dcom_interface *iface = dcom_interface_by_iid(iid);
-
- if (!iface) {
- DEBUG (1, ("Unable to find interface with IID %s\n", GUID_string(ctx, iid)));
- return NULL;
- }
-
- ip->ctx = ctx;
- ip->interface = iface;
- ip->vtable = vtable;
- ip->ipid = GUID_random();
- ip->object = object;
- ip->objref_flags = 0;
- ip->orpc_flags = 0;
- ip->ox = NULL;
- ip->private_references = 1;
-
- return ip;
-}
diff --git a/source4/lib/dcom/common/rot.c b/source4/lib/dcom/common/rot.c
deleted file mode 100644
index 7acdbe066e..0000000000
--- a/source4/lib/dcom/common/rot.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- Unix SMB/CIFS implementation.
-
- Running object table functions
-
- 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"
-
-struct dcom_interface_p *dcom_get_local_iface_p(struct GUID *ipid)
-{
- /* FIXME: Call the local ROT and do a
- * rot_get_interface_pointer call */
-
- /* FIXME: Perhaps have a local (thread-local) table with
- * local DCOM objects so that not every DCOM call requires a lookup
- * to the ROT? */
- return NULL;
-}
diff --git a/source4/lib/dcom/common/tables.c b/source4/lib/dcom/common/tables.c
deleted file mode 100644
index cd7e0867ee..0000000000
--- a/source4/lib/dcom/common/tables.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- Unix SMB/CIFS implementation.
- DCOM interface and class tables
- Copyright (C) 2004 Jelmer Vernooij <jelmer@samba.org>
-
- 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"
-#include "dlinklist.h"
-
-static struct class_list {
- struct class_list *prev, *next;
- struct dcom_class class;
-} *classes = NULL;
-
-static struct interface_list {
- struct interface_list *prev, *next;
- struct dcom_interface interface;
-} *interfaces = NULL;
-
-const struct dcom_interface *dcom_interface_by_iid(const struct GUID *iid)
-{
- struct interface_list *l = interfaces;
-
- while(l) {
-
- if (GUID_equal(iid, &l->interface.iid))
- return &l->interface;
-
- l = l->next;
- }
-
- return NULL;
-}
-
-const struct dcom_class *dcom_class_by_clsid(const struct GUID *clsid)
-{
- struct class_list *c = classes;
-
- while(c) {
-
- if (GUID_equal(clsid, &c->class.clsid)) {
- return &c->class;
- }
-
- c = c->next;
- }
-
- return NULL;
-}
-
-const void *dcom_proxy_vtable_by_iid(const struct GUID *iid)
-{
- const struct dcom_interface *iface = dcom_interface_by_iid(iid);
-
- if (!iface) {
- return NULL;
- }
-
- return iface->proxy_vtable;
-}
-
-NTSTATUS dcom_register_interface(const void *_iface)
-{
- const struct dcom_interface *iface = _iface;
- struct interface_list *l;
- TALLOC_CTX *lcl_ctx = talloc_init("dcom_register_interface");
-
- DEBUG(5, ("Adding DCOM interface %s\n", GUID_string(lcl_ctx, &iface->iid)));
-
- talloc_free(lcl_ctx);
-
- l = talloc_zero(interfaces?interfaces:talloc_autofree_context(),
- struct interface_list);
-
- l->interface = *iface;
-
- DLIST_ADD(interfaces, l);
-
- return NT_STATUS_OK;
-}
-
-NTSTATUS dcom_register_class(const void *_class)
-{
- const struct dcom_class *class = _class;
- struct class_list *l = talloc_zero(classes?classes:talloc_autofree_context(),
- struct class_list);
-
- l->class = *class;
-
- DLIST_ADD(classes, l);
-
- return NT_STATUS_OK;
-}