diff options
author | Jelmer Vernooij <jelmer@samba.org> | 2005-02-21 14:30:49 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:10:50 -0500 |
commit | 80d3047333fceb3805ccd10a08cdf95021f57ff4 (patch) | |
tree | 16ccb10ace9efe6b52d80e8bfd3f0fd483762f23 /source4/torture | |
parent | 6b4cac2c00bd77c34bfe47f35729a60782b8c9c2 (diff) | |
download | samba-80d3047333fceb3805ccd10a08cdf95021f57ff4.tar.gz samba-80d3047333fceb3805ccd10a08cdf95021f57ff4.tar.bz2 samba-80d3047333fceb3805ccd10a08cdf95021f57ff4.zip |
r5490: The big (D)COM commit! :-) Contains most of the changes described in the
DCOM paper in lorikeet. This is the result of 1.5 months work (mainly
figuring out how things *really* work) at the end of 2004.
In general:
- Clearer distinction between COM and DCOM. DCOM is now merely
the glue between DCE/RPC+ORPC and COM. COM can also work without
DCOM now. This makes the code a lot clearer.
- Clearer distinction between NDR and DCOM. Before, NDR had a couple of
"if"s to cope with DCOM, which are now gone.
- Use "real" arguments rather then structures for function arguments in
COM, mainly because most of these calls are local so packing/unpacking
data for every call is too much overhead (both speed- and code-wise)
- Support several mechanisms to load class objects:
- from memory (e.g. part of the current executable, registered at start-up)
- from shared object files
- remotely
- Most things are now also named COM rather then DCOM because that's what it
really is. After an object is created, it no longer matters whether it
was created locally or remotely.
There is a very simple example class that contains
both a class factory and a class that implements the IStream interface.
It can be tested (locally only, remotely is broken at the moment)
by running the COM-SIMPLE smbtorture test.
Still to-do:
- Autogenerate parts of the class implementation code (using the coclass definitions in IDL)
- Test server-side
- Implement some of the common classes, add definitions for common interfaces.
(This used to be commit 71fd3e5c3aac5f0002001ab29d2248e6c6842d6f)
Diffstat (limited to 'source4/torture')
-rw-r--r-- | source4/torture/com/simple.c | 93 | ||||
-rw-r--r-- | source4/torture/config.mk | 7 | ||||
-rw-r--r-- | source4/torture/dcom/simple.c | 114 | ||||
-rw-r--r-- | source4/torture/torture.c | 3 |
4 files changed, 100 insertions, 117 deletions
diff --git a/source4/torture/com/simple.c b/source4/torture/com/simple.c new file mode 100644 index 0000000000..369b03f151 --- /dev/null +++ b/source4/torture/com/simple.c @@ -0,0 +1,93 @@ +/* + Unix SMB/CIFS implementation. + run the "simple" example (D)COM program + + 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" +#include "lib/com/com.h" +#include "librpc/gen_ndr/com_dcom.h" + +#define CLSID_SIMPLE "5e9ddec7-5767-11cf-beab-00aa006c3606" +#define DEFAULT_TRANS 4096 + +static BOOL test_readwrite(TALLOC_CTX *mem_ctx, const char *host) +{ + struct dcerpc_pipe *p = NULL; + BOOL ret = True; + struct GUID IID[2]; + struct GUID clsid; + WERROR error; + struct IUnknown *interfaces[3]; + WERROR results[2]; + struct com_context *ctx; + char test_data[5]; + int i; + + com_init(&ctx); + + GUID_from_string(COM_ISTREAM_UUID, &IID[0]); + GUID_from_string(COM_IUNKNOWN_UUID, &IID[1]); + GUID_from_string(CLSID_SIMPLE, &clsid); +/* error = dcom_create_object(ctx, &clsid, + host, 2, IID, + &interfaces, + results);*/ + + error = com_create_object(ctx, &clsid, 2, IID, interfaces, results); + + if (!W_ERROR_IS_OK(error)) { + printf("(d)com_create_object failed - %s\n", win_errstr(error)); + return False; + } + + error = IStream_Read((struct IStream *)interfaces[0], mem_ctx, NULL, 20, 20, 30); + if (!W_ERROR_IS_OK(error)) { + printf("IStream::Read() failed - %s\n", win_errstr(error)); + ret = False; + } + + for (i = 0; i < 5; i++) { + test_data[i] = i+1; + } + + error = IStream_Write((struct IStream *)interfaces[0], mem_ctx, &test_data, 5, NULL); + if (!W_ERROR_IS_OK(error)) { + printf("IStream::Write() failed - %s\n", win_errstr(error)); + ret = False; + } + + IUnknown_Release((struct IUnknown *)interfaces[1], mem_ctx); + + torture_rpc_close(p); + + return True; +} + +BOOL torture_com_simple(void) +{ + BOOL ret = True; + TALLOC_CTX *mem_ctx = talloc_init("torture_dcom_simple"); + + ret &= test_readwrite(mem_ctx, NULL); + ret &= test_readwrite(mem_ctx, lp_parm_string(-1, "torture", "dcomhost")); + + talloc_free(mem_ctx); + + return ret; +} diff --git a/source4/torture/config.mk b/source4/torture/config.mk index 2a81ac1c7c..5ac33bb556 100644 --- a/source4/torture/config.mk +++ b/source4/torture/config.mk @@ -59,11 +59,11 @@ REQUIRED_SUBSYSTEMS = \ ################################# # Start SUBSYSTEM TORTURE_DCOM -[SUBSYSTEM::TORTURE_DCOM] +[SUBSYSTEM::TORTURE_COM] ADD_OBJ_FILES = \ - torture/dcom/simple.o + torture/com/simple.o REQUIRED_SUBSYSTEMS = \ - LIBDCOM + LIBCOM # End SUBSYSTEM TORTURE_DCOM ################################# @@ -196,6 +196,7 @@ REQUIRED_SUBSYSTEMS = \ TORTURE_LOCAL \ TORTURE_NBENCH \ TORTURE_LDAP \ + TORTURE_COM \ TORTURE_NBT \ CONFIG \ LIBCMDLINE \ diff --git a/source4/torture/dcom/simple.c b/source4/torture/dcom/simple.c deleted file mode 100644 index 4e9ae1be28..0000000000 --- a/source4/torture/dcom/simple.c +++ /dev/null @@ -1,114 +0,0 @@ -/* - Unix SMB/CIFS implementation. - run the "simple" example DCOM program - - 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" -#include "librpc/gen_ndr/ndr_dcom.h" -#include "librpc/gen_ndr/ndr_oxidresolver.h" - -#define CLSID_SIMPLE "5e9ddec7-5767-11cf-beab-00aa006c3606" -#define DEFAULT_TRANS 4096 - -static BOOL test_readwrite(TALLOC_CTX *mem_ctx, const char *host) -{ - NTSTATUS status; - struct dcerpc_pipe *p = NULL; - BOOL ret = True; - struct GUID IID[2]; - struct GUID clsid; - WERROR error; - struct dcom_interface_p **interfaces; - struct Read r_read; - struct Write r_write; - WERROR results[2]; - struct dcom_context *ctx; - char test_data[5]; - int i; - extern NTSTATUS dcom_IUnknown_init(void); - extern NTSTATUS dcom_IStream_init(void); - - torture_dcom_init(&ctx); - - GUID_from_string(DCERPC_ISTREAM_UUID, &IID[0]); - GUID_from_string(DCERPC_IUNKNOWN_UUID, &IID[1]); - GUID_from_string(CLSID_SIMPLE, &clsid); - error = dcom_create_object(ctx, &clsid, - host, 2, IID, - &interfaces, - results); - - if (!W_ERROR_IS_OK(error)) { - printf("dcom_create_object failed - %s\n", win_errstr(error)); - return False; - } - - if (!W_ERROR_IS_OK(results[0])) { - printf("dcom_create_object didn't return IStream interface - %s\n", win_errstr(results[0])); - return False; - } - - ZERO_STRUCT(r_read); - r_read.in.num_requested = 20; /* Give me 20 0xFF bytes... */ - status = dcom_IStream_Read(interfaces[0], mem_ctx, &r_read); - if (NT_STATUS_IS_ERR(status)) { - printf("IStream::Read() failed - %s\n", nt_errstr(status)); - ret = False; - } else if (!W_ERROR_IS_OK(r_read.out.result)) { - printf("IStream::Read() failed - %s\n", win_errstr(r_read.out.result)); - ret = False; - } - - for (i = 0; i < 5; i++) { - test_data[i] = i+1; - } - r_write.in.num_requested = 5; - r_write.in.data = (uint8_t *)&test_data; - status = dcom_IStream_Write(interfaces[0], mem_ctx, &r_write); - if (NT_STATUS_IS_ERR(status)) { - printf("IStream::Write() failed - %s\n", nt_errstr(status)); - ret = False; - } else if (!W_ERROR_IS_OK(r_write.out.result)) { - printf("IStream::Write() failed - %s\n", win_errstr(r_write.out.result)); - ret = False; - } - - status = dcom_IUnknown_Release(interfaces[1], mem_ctx, NULL); - if (NT_STATUS_IS_ERR(status)) { - printf("IUnknown::Release() failed - %s\n", nt_errstr(status)); - return False; - } - - talloc_free(mem_ctx); - - torture_rpc_close(p); - - return True; -} - -BOOL torture_dcom_simple(void) -{ - BOOL ret = True; - TALLOC_CTX *mem_ctx = talloc_init("torture_dcom_simple"); - - ret &= test_readwrite(mem_ctx, NULL); - ret &= test_readwrite(mem_ctx, lp_parm_string(-1, "torture", "dcomhost")); - - return ret; -} diff --git a/source4/torture/torture.c b/source4/torture/torture.c index ac9af7ed4b..b589902b66 100644 --- a/source4/torture/torture.c +++ b/source4/torture/torture.c @@ -2416,6 +2416,9 @@ static struct { {"LOCAL-IDTREE", torture_local_idtree, 0}, {"LOCAL-SOCKET", torture_local_socket, 0}, + /* COM (Component Object Model) testers */ + {"COM-SIMPLE", torture_com_simple, 0 }, + /* ldap testers */ {"LDAP-BASIC", torture_ldap_basic, 0}, |