[SCM] Samba Shared Repository - branch master updated

Anatoliy Atanasov anatoliy at samba.org
Thu Sep 23 14:34:57 MDT 2010


The branch, master has been updated
       via  859f3cd s4/eventlog6: Add dummy implementation for calls 0x5 and 0xB
       via  411e6bc s4/eventlog6: Build and hook EventLog6 RPC endpont mapper and idl
       via  b236098 s4/eventlog6: Add endpoint server for EventLog6 RPC
       via  55fe86b s4/eventlog6: Add idl for EventLog6 RPC
       via  bea4948 pidl:NDR/Parser: fix range() for arrays
      from  6673146 tdb: add restore

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 859f3cdd4a9d282594f195b032a65ea1c2db2703
Author: Anatoliy Atanasov <anatoliy.atanasov at postpath.com>
Date:   Thu Sep 23 11:45:16 2010 -0700

    s4/eventlog6: Add dummy implementation for calls 0x5 and 0xB
    
    The code is enough to let us run all dcdiag tests against samba4 server

commit 411e6bc3f2d18c675475113fbab6c586204472be
Author: Anatoliy Atanasov <anatoliy.atanasov at postpath.com>
Date:   Thu Sep 23 11:39:47 2010 -0700

    s4/eventlog6: Build and hook EventLog6 RPC endpont mapper and idl

commit b23609812a72fb90cb80351de5bc144601a4a82d
Author: Anatoliy Atanasov <anatoliy.atanasov at postpath.com>
Date:   Thu Sep 23 11:38:19 2010 -0700

    s4/eventlog6: Add endpoint server for EventLog6 RPC
    
    The file is generated using PIDL --template command.

commit 55fe86bccc4c579e77fab8a20a53e4bbb2a55bc8
Author: Anatoliy Atanasov <anatoliy.atanasov at postpath.com>
Date:   Thu Sep 23 11:31:32 2010 -0700

    s4/eventlog6: Add idl for EventLog6 RPC
    
    The idl is translated from [MS-EVEN6].pdf.

commit bea4948acb4bbee2fbf886adeb53edbc84de96da
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Sep 21 05:41:37 2010 +0200

    pidl:NDR/Parser: fix range() for arrays
    
    metze

-----------------------------------------------------------------------

Summary of changes:
 librpc/idl/eventlog6.idl                       |  343 ++++++++++++++++++++++++
 librpc/idl/wscript_build                       |    2 +-
 pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm       |   33 +++-
 source4/librpc/wscript_build                   |    2 +-
 source4/param/loadparm.c                       |    2 +-
 source4/rpc_server/config.mk                   |   14 +
 source4/rpc_server/dcerpc_server.c             |    1 +
 source4/rpc_server/eventlog/dcesrv_eventlog6.c |  323 ++++++++++++++++++++++
 source4/rpc_server/wscript_build               |    6 +
 9 files changed, 722 insertions(+), 4 deletions(-)
 create mode 100644 librpc/idl/eventlog6.idl
 create mode 100644 source4/rpc_server/eventlog/dcesrv_eventlog6.c


Changeset truncated at 500 lines:

diff --git a/librpc/idl/eventlog6.idl b/librpc/idl/eventlog6.idl
new file mode 100644
index 0000000..0cda95b
--- /dev/null
+++ b/librpc/idl/eventlog6.idl
@@ -0,0 +1,343 @@
+#include "idl_types.h"
+
+
+import "misc.idl";
+
+cpp_quote("#define MAX_RPC_GUID_ARRAY_COUNT (MAX_PAYLOAD / sizeof(struct GUID))")
+cpp_quote("#define eventlog6_EvtRpcSubscribePull    0x10000000")
+cpp_quote("#define eventlog6_EvtRpcVarFlagsModified 0x00000001")
+
+[
+    uuid (f6beaff7-1e19-4fbb-9f8f-b89e2018337c),
+    version(1.0),
+    endpoint("ncacn_ip_tcp:"),
+    helpstring("Eventlog6"),
+    pointer_default(unique)
+]
+interface eventlog6
+{
+	const int MAX_PAYLOAD                  = 2 * 1024 * 1024;
+	const int MAX_RPC_QUERY_LENGTH         = MAX_PAYLOAD / sizeof(uint16_t);
+	const int MAX_RPC_CHANNEL_NAME_LENGTH  = 512;
+	const int MAX_RPC_QUERY_CHANNEL_SIZE   = 512;
+	const int MAX_RPC_EVENT_ID_SIZE        = 256;
+	const int MAX_RPC_FILE_PATH_LENGTH     = 32768;
+	const int MAX_RPC_CHANNEL_PATH_LENGTH  = 32768;
+	const int MAX_RPC_BOOKMARK_LENGTH      = MAX_PAYLOAD / sizeof(uint16_t);
+	const int MAX_RPC_PUBLISHER_ID_LENGTH  = 2048;
+	const int MAX_RPC_PROPERTY_BUFFER_SIZE = MAX_PAYLOAD;
+	const int MAX_RPC_FILTER_LENGTH        = MAX_RPC_QUERY_LENGTH;
+	const int MAX_RPC_RECORD_COUNT         = 1024;
+	const int MAX_RPC_EVENT_SIZE           = MAX_PAYLOAD;
+	const int MAX_RPC_BATCH_SIZE           = MAX_PAYLOAD;
+	const int MAX_RPC_RENDERED_STRING_SIZE = MAX_PAYLOAD;
+	const int MAX_RPC_CHANNEL_COUNT        = 8192;
+	const int MAX_RPC_PUBLISHER_COUNT      = 8192;
+	const int MAX_RPC_EVENT_METADATA_COUNT = 256;
+	const int MAX_RPC_VARIANT_LIST_COUNT   = 256;
+	const int MAX_RPC_BOOLEAN8_ARRAY_COUNT = MAX_PAYLOAD / sizeof(uint8_t);
+	const int MAX_RPC_UINT32_ARRAY_COUNT   = MAX_PAYLOAD / sizeof(uint32_t);
+	const int MAX_RPC_UINT64_ARRAY_COUNT   = MAX_PAYLOAD / sizeof(uint64_t);
+	const int MAX_RPC_STRING_ARRAY_COUNT   = MAX_PAYLOAD / 512;
+	const int MAX_RPC_STRING_LENGTH        = MAX_PAYLOAD / sizeof(uint16_t);
+
+	typedef struct {
+		uint32 error;
+		uint32 sub_err;
+		uint32 sub_err_param;
+	} eventlog6_RpcInfo;
+
+	typedef struct {
+		[range(0, MAX_RPC_BOOLEAN8_ARRAY_COUNT)] uint32 count;
+		[size_is(count)] boolean8* ptr;
+	} eventlog6_boolean8Array;
+
+	typedef struct {
+		[range(0, MAX_RPC_UINT32_ARRAY_COUNT)] uint32 count;
+		[size_is(count)] uint32* ptr;
+	} eventlog6_UInt32Array;
+
+	typedef struct {
+		[range(0, MAX_RPC_UINT64_ARRAY_COUNT)] uint32 count;
+		[size_is(count)] hyper* ptr;
+	} eventlog6_UInt64Array;
+
+	typedef struct {
+		[range(0, MAX_RPC_STRING_ARRAY_COUNT)] uint32 count;
+		[size_is(count),charset(UTF16),string] uint16 *ptr;
+	} eventlog6_StringArray;
+
+	typedef struct {
+		[range(0, MAX_RPC_GUID_ARRAY_COUNT)] uint32 count;
+		[size_is(count)] GUID* ptr;
+	} eventlog6_GuidArray;
+
+	typedef [v1_enum] enum {
+		EvtRpcVarTypeNull          = 0,
+		EvtRpcVarTypeboolean8      = 1,
+		EvtRpcVarTypeUInt32        = 2,
+		EvtRpcVarTypeUInt64        = 3,
+		EvtRpcVarTypeString        = 4,
+		EvtRpcVarTypeGuid          = 5,
+		EvtRpcVarTypeboolean8Array = 6,
+		EvtRpcVarTypeUInt32Array   = 7,
+		EvtRpcVarTypeUInt64Array   = 8,
+		EvtRpcVarTypeStringArray   = 9,
+		EvtRpcVarTypeGuidArray     = 10
+	} eventlog6_EvtRpcVariantType;
+
+	typedef [v1_enum] enum {
+		EvtRpcChannelPath   = 0,
+		EvtRpcPublisherName = 1
+	} eventlog6_EvtRpcAssertConfigFlags;
+
+	typedef [switch_type(eventlog6_EvtRpcVariantType)] union {
+		[case(EvtRpcVarTypeNull)] int nullVal;
+		[case(EvtRpcVarTypeboolean8)] boolean8 boolean8Val;
+		[case(EvtRpcVarTypeUInt32)] uint32 uint32Val;
+		[case(EvtRpcVarTypeUInt64)] hyper uint64Val;
+		[case(EvtRpcVarTypeString)] [charset(UTF16),string] uint16 *stringVal;
+		[case(EvtRpcVarTypeGuid)] GUID *guidVal;
+		[case(EvtRpcVarTypeboolean8Array)] eventlog6_boolean8Array boolean8Array;
+		[case(EvtRpcVarTypeUInt32Array)] eventlog6_UInt32Array uint32Array;
+		[case(EvtRpcVarTypeUInt64Array)] eventlog6_UInt64Array uint64Array;
+		[case(EvtRpcVarTypeStringArray)] eventlog6_StringArray stringArray;
+		[case(EvtRpcVarTypeGuidArray)] eventlog6_GuidArray guidArray;
+	} eventlog6_EvtRpcVariantUnion;
+
+	typedef struct {
+		eventlog6_EvtRpcVariantType type;
+		uint32 flags;
+		[in,ref,switch_is(type)] eventlog6_EvtRpcVariantUnion *var;
+	} eventlog6_EvtRpcVariant;
+
+	typedef struct {
+		[range(0, MAX_RPC_VARIANT_LIST_COUNT)] uint32 count;
+		[size_is(count)] eventlog6_EvtRpcVariant* props;
+	} eventlog6_EvtRpcVariantList;
+
+	typedef struct {
+		[charset(UTF16),string] uint16 *name;
+		uint32 status;
+	} eventlog6_EvtRpcQueryChannelInfo;
+
+	WERROR eventlog6_EvtRpcRegisterRemoteSubscription(
+		[in, unique, range(0, MAX_RPC_CHANNEL_NAME_LENGTH),charset(UTF16),string] uint16 *channelPath,
+		[in, range(1, MAX_RPC_QUERY_LENGTH),charset(UTF16),string] uint16 *query,
+		[in, unique, range(0, MAX_RPC_BOOKMARK_LENGTH),charset(UTF16),string] uint16 *bookmarkXml,
+		[in] uint32 flags,
+		[out, ref] policy_handle *handle,
+		[out, ref] policy_handle *control,
+		[out, ref] uint32 *queryChannelInfoSize,
+		[out, size_is(,*queryChannelInfoSize), range(0, MAX_RPC_QUERY_CHANNEL_SIZE)]
+		eventlog6_EvtRpcQueryChannelInfo **queryChannelInfo,
+		[out, ref] eventlog6_RpcInfo *error);
+
+	WERROR eventlog6_EvtRpcRemoteSubscriptionNextAsync(
+		[in, ref] policy_handle *handle,
+		[in] uint32 numRequestedRecords,
+		[in] uint32 flags,
+		[out, ref] uint32 *numActualRecords,
+		[out, size_is(,*numActualRecords), range(0, MAX_RPC_RECORD_COUNT)]
+		uint32 **eventDataIndices,
+		[out, size_is(,*numActualRecords), range(0, MAX_RPC_RECORD_COUNT)]
+		uint32 **eventDataSizes,
+		[out, ref] uint32* resultBufferSize,
+		[out, size_is(,*resultBufferSize), range(0, MAX_RPC_BATCH_SIZE)]
+		uint8 **resultBuffer);
+
+	WERROR eventlog6_EvtRpcRemoteSubscriptionNext(
+		[in, ref] policy_handle *handle,
+		[in] uint32 numRequestedRecords,
+		[in] uint32 timeOut,
+		[in] uint32 flags,
+		[out, ref] uint32 *numActualRecords,
+		[out, size_is(,*numActualRecords), range(0, MAX_RPC_RECORD_COUNT)]
+		uint32 **eventDataIndices,
+		[out, size_is(,*numActualRecords), range(0, MAX_RPC_RECORD_COUNT)]
+		uint32 **eventDataSizes,
+		[out, ref] uint32 *resultBufferSize,
+		[out, size_is(,*resultBufferSize), range(0, MAX_RPC_BATCH_SIZE)]
+		uint8 **resultBuffer);
+
+	WERROR eventlog6_EvtRpcRemoteSubscriptionWaitAsync(
+		[in, ref] policy_handle *handle);
+
+	WERROR eventlog6_EvtRpcRegisterControllableOperation(
+		[out, ref] policy_handle *handle);
+
+	WERROR eventlog6_EvtRpcRegisterLogQuery(
+		[in, unique, range(0, MAX_RPC_CHANNEL_PATH_LENGTH),charset(UTF16),string] uint16 *path,
+		[in, range(1, MAX_RPC_QUERY_LENGTH),charset(UTF16),string] uint16 *query,
+		[in] uint32 flags,
+		[out, ref] policy_handle *handle,
+		[out, ref] policy_handle *opControl,
+		[out, ref] uint32 *queryChannelInfoSize,
+		[out, size_is(,*queryChannelInfoSize), range(0, MAX_RPC_QUERY_CHANNEL_SIZE)]
+		eventlog6_EvtRpcQueryChannelInfo **queryChannelInfo,
+		[out, ref] eventlog6_RpcInfo *error);
+
+	WERROR eventlog6_EvtRpcClearLog(
+		[in, ref] policy_handle *control,
+		[in, range(0, MAX_RPC_CHANNEL_NAME_LENGTH),charset(UTF16),string] uint16 *channelPath,
+		[in, unique, range(0, MAX_RPC_FILE_PATH_LENGTH),charset(UTF16),string] uint16 *backupPath,
+		[in] uint32 flags,
+		[out, ref] eventlog6_RpcInfo *error);
+
+	WERROR 	eventlog6_EvtRpcExportLog(
+		[in, ref] policy_handle *control,
+		[in, unique, range(0, MAX_RPC_CHANNEL_NAME_LENGTH),charset(UTF16),string] uint16 *channelPath,
+		[in, range(1, MAX_RPC_QUERY_LENGTH),charset(UTF16),string] uint16 *query,
+		[in, range(1, MAX_RPC_FILE_PATH_LENGTH),charset(UTF16),string] uint16 *backupPath,
+		[in] uint32 flags,
+		[out, ref] eventlog6_RpcInfo *error);
+
+	WERROR eventlog6_EvtRpcLocalizeExportLog(
+		[in, ref] policy_handle *control,
+		[in, range(1, MAX_RPC_FILE_PATH_LENGTH),charset(UTF16),string] uint16 *logFilePath,
+		[in] uint32 locale,
+		[in] uint32 flags,
+		[out, ref] eventlog6_RpcInfo *error);
+
+	WERROR eventlog6_EvtRpcMessageRender(
+		[in, ref] policy_handle *pubCfgObj,
+		[in, range(1, MAX_RPC_EVENT_ID_SIZE)] uint32 sizeEventId,
+		[in, size_is(sizeEventId)] uint8 *eventId,
+		[in] uint32 messageId,
+		[in] eventlog6_EvtRpcVariantList *values,
+		[in] uint32 flags,
+		[in] uint32 maxSizeString,
+		[out, ref] uint32 *actualSizeString,
+		[out, ref] uint32 *neededSizeString,
+		[out, size_is(,*actualSizeString), range(0, MAX_RPC_RENDERED_STRING_SIZE)]
+		uint8 **string,
+		[out, ref] eventlog6_RpcInfo *error);
+
+	WERROR eventlog6_EvtRpcMessageRenderDefault(
+		[in, range(1, MAX_RPC_EVENT_ID_SIZE)] uint32 sizeEventId,
+		[in, size_is(sizeEventId)] uint8 *eventId,
+		[in] uint32 messageId,
+		[in] eventlog6_EvtRpcVariantList *values,
+		[in] uint32 flags,
+		[in] uint32 maxSizeString,
+		[out, ref] uint32 *actualSizeString,
+		[out, ref] uint32 *neededSizeString,
+		[out, size_is(,*actualSizeString), range(0, MAX_RPC_RENDERED_STRING_SIZE)]
+		uint8 **string,
+		[out, ref] eventlog6_RpcInfo *error);
+
+	WERROR eventlog6_EvtRpcQueryNext(
+		[in, ref] policy_handle *logQuery,
+		[in] uint32 numRequestedRecords,
+		[in] uint32 timeOutEnd,
+		[in] uint32 flags,
+		[out, ref] uint32 *numActualRecords,
+		[out, size_is(,*numActualRecords), range(0, MAX_RPC_RECORD_COUNT)]
+		uint32 **eventDataIndices,
+		[out, size_is(,*numActualRecords), range(0, MAX_RPC_RECORD_COUNT)]
+		uint32 **eventDataSizes,
+		[out, ref] uint32 *resultBufferSize,
+		[out, size_is(,*resultBufferSize), range(0, MAX_RPC_BATCH_SIZE)]
+		uint8 **resultBuffer);
+
+	WERROR eventlog6_EvtRpcQuerySeek(
+		[in, ref] policy_handle *logQuery,
+		[in] hyper pos,
+		[in, unique, range(0, MAX_RPC_BOOKMARK_LENGTH),charset(UTF16),string] uint16 *bookmarkXml,
+		[in] uint32 timeOut,
+		[in] uint32 flags,
+		[out, ref] eventlog6_RpcInfo *error);
+
+	WERROR eventlog6_EvtRpcClose(
+		[in, out, ref] policy_handle **handle);
+
+	WERROR eventlog6_EvtRpcCancel(
+		[in, ref] policy_handle *handle);
+
+	WERROR eventlog6_EvtRpcAssertConfig(
+		[in, range(1, MAX_RPC_CHANNEL_NAME_LENGTH),charset(UTF16),string] uint16 *path,
+		[in] uint32 flags);
+
+	WERROR eventlog6_EvtRpcRetractConfig(
+		[in, range(1, MAX_RPC_CHANNEL_NAME_LENGTH),charset(UTF16),string] uint16 *path,
+		[in] uint32 flags );
+
+	WERROR eventlog6_EvtRpcOpenLogHandle(
+		[in, range(1, MAX_RPC_CHANNEL_NAME_LENGTH),charset(UTF16),string] uint16 *channel,
+		[in] uint32 flags,
+		[out, ref] policy_handle *handle,
+		[out, ref] eventlog6_RpcInfo *error);
+
+	WERROR eventlog6_EvtRpcGetLogFileInfo(
+		[in, ref] policy_handle *logHandle,
+		[in] uint32 propertyId,
+		[in, range(0, MAX_RPC_PROPERTY_BUFFER_SIZE)]
+		uint32 propertyValueBufferSize,
+		[out, size_is(propertyValueBufferSize)] uint8 *propertyValueBuffer,
+		[out, ref] uint32 *propertyValueBufferLength);
+
+	WERROR eventlog6_EvtRpcGetChannelList(
+		[in] uint32 flags,
+		[out, ref] uint32 *numChannelPaths,
+		[out, size_is(,*numChannelPaths), range(0, MAX_RPC_CHANNEL_COUNT),charset(UTF16),string]
+		uint16 ***channelPaths);
+
+	WERROR eventlog6_EvtRpcGetChannelConfig(
+		[in, range(1, MAX_RPC_CHANNEL_NAME_LENGTH),charset(UTF16),string] uint16 *channelPath,
+		[in] uint32 flags,
+		[out, ref] eventlog6_EvtRpcVariantList* props);
+
+	WERROR eventlog6_EvtRpcPutChannelConfig(
+		[in, range(1, MAX_RPC_CHANNEL_NAME_LENGTH),charset(UTF16),string] uint16 *channelPath,
+		[in] uint32 flags,
+		[in] eventlog6_EvtRpcVariantList* props,
+		[out, ref] eventlog6_RpcInfo *error);
+
+	WERROR eventlog6_EvtRpcGetPublisherList(
+		[in] uint32 flags,
+		[out, ref] uint32 *numPublisherIds,
+		[out, size_is(,*numPublisherIds), range(0, MAX_RPC_PUBLISHER_COUNT),charset(UTF16),string]
+		uint16 ***publisherIds);
+
+	WERROR eventlog6_EvtRpcGetPublisherListForChannel(
+		[in] uint16 *channelName,
+		[in] uint32 flags,
+		[out, ref] uint32* numPublisherIds,
+		[out, size_is(,*numPublisherIds), range(0, MAX_RPC_PUBLISHER_COUNT),charset(UTF16),string]
+		uint16 ***publisherIds);
+
+	WERROR eventlog6_EvtRpcGetPublisherMetadata(
+		[in, unique, range(0, MAX_RPC_PUBLISHER_ID_LENGTH),charset(UTF16),string] uint16 *publisherId,
+		[in, unique, range(0, MAX_RPC_FILE_PATH_LENGTH),charset(UTF16),string] uint16 *logFilePath,
+		[in] uint32 locale,
+		[in] uint32 flags,
+		[out, ref] eventlog6_EvtRpcVariantList* pubMetadataProps,
+		[out, ref] policy_handle *pubMetadata);
+
+	WERROR eventlog6_EvtRpcGetPublisherResourceMetadata(
+		[in, ref] policy_handle *handle,
+		[in] uint32 propertyId,
+		[in] uint32 flags,
+		[out, ref] eventlog6_EvtRpcVariantList *pubMetadataProps);
+
+	WERROR eventlog6_EvtRpcGetEventMetadataEnum(
+		[in, ref] policy_handle *pubMetadata,
+		[in] uint32 flags,
+		[in, unique, range(0, MAX_RPC_FILTER_LENGTH),charset(UTF16),string] uint16 *reservedForFilter,
+		[out, ref] policy_handle *eventMetaDataEnum);
+
+	WERROR eventlog6_EvtRpcGetNextEventMetadata(
+		[in, ref] policy_handle *eventMetaDataEnum,
+		[in] uint32 flags,
+		[in] uint32 numRequested,
+		[out, ref] uint32 *numReturned,
+		[out, size_is(,*numReturned), range(0, MAX_RPC_EVENT_METADATA_COUNT)]
+		eventlog6_EvtRpcVariantList **eventMetadataInstances);
+
+	WERROR eventlog6_EvtRpcGetClassicLogDisplayName(
+		[in, range(1, MAX_RPC_CHANNEL_NAME_LENGTH),charset(UTF16),string] uint16 *logName,
+		[in] uint32 locale,
+		[in] uint32 flags,
+		[out] uint16 **displayName);
+}
+
diff --git a/librpc/idl/wscript_build b/librpc/idl/wscript_build
index b8d11ba..4dc1199 100644
--- a/librpc/idl/wscript_build
+++ b/librpc/idl/wscript_build
@@ -10,7 +10,7 @@ bld.SAMBA_PIDL_LIST('PIDL',
                        dbgidl.idl dnsserver.idl echo.idl frsrpc.idl lsa.idl nbt.idl
                        oxidresolver.idl samr.idl srvsvc.idl winreg.idl dcerpc.idl
                        drsblobs.idl efs.idl frstrans.idl mgmt.idl netlogon.idl
-                       policyagent.idl scerpc.idl svcctl.idl wkssvc.idl''',
+                       policyagent.idl scerpc.idl svcctl.idl wkssvc.idl eventlog6.idl''',
                     options='--header --ndr-parser --samba3-ndr-server --samba3-ndr-client --server --client --python',
                     output_dir='../gen_ndr')
 
diff --git a/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm b/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
index b389cfb..02f7c9a 100644
--- a/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
+++ b/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
@@ -870,7 +870,10 @@ sub ParseDataPull($$$$$$$)
 
 		$self->pidl("NDR_CHECK(".TypeFunctionName("ndr_pull", $l->{DATA_TYPE})."($ndr, $ndr_flags, $var_name));");
 
-		if (my $range = has_property($e, "range")) {
+		my $pl = GetPrevLevel($e, $l);
+
+		my $range = has_property($e, "range");
+		if ($range and $pl->{TYPE} ne "ARRAY") {
 			$var_name = get_value_of($var_name);
 			my $signed = Parse::Pidl::Typelist::is_signed($l->{DATA_TYPE});
 			my ($low, $high) = split(/,/, $range, 2);
@@ -1015,6 +1018,20 @@ sub ParseElementPullLevel
 		} elsif ($l->{TYPE} eq "ARRAY") {
 			my $length = $self->ParseArrayPullHeader($e, $l, $ndr, $var_name, $env);
 
+			if (my $range = has_property($e, "range")) {
+				my ($low, $high) = split(/,/, $range, 2);
+				if ($low < 0) {
+					warning(0, "$low is invalid for the range of an array size");
+				}
+				if ($low == 0) {
+					$self->pidl("if ($length > $high) {");
+				} else {
+					$self->pidl("if ($length < $low || $length > $high) {");
+				}
+				$self->pidl("\treturn ndr_pull_error($ndr, NDR_ERR_RANGE, \"value out of range\");");
+				$self->pidl("}");
+			}
+
 			my $nl = GetNextLevel($e, $l);
 
 			if (is_charset_array($e,$l)) {
@@ -1083,6 +1100,20 @@ sub ParseElementPullLevel
 			$length = "ndr_get_array_length($ndr, " . get_pointer_to($var_name) .")";
 		}
 
+		if (my $range = has_property($e, "range")) {
+			my ($low, $high) = split(/,/, $range, 2);
+			if ($low < 0) {
+				warning(0, "$low is invalid for the range of an array size");
+			}
+			if ($low == 0) {
+				$self->pidl("if ($length > $high) {");
+			} else {
+				$self->pidl("if ($length < $low || $length > $high) {");
+			}
+			$self->pidl("\treturn ndr_pull_error($ndr, NDR_ERR_RANGE, \"value out of range\");");
+			$self->pidl("}");
+		}
+
 		$var_name = get_array_element($var_name, $counter);
 
 		$self->ParseMemCtxPullStart($e, $l, $ndr, $array_name);
diff --git a/source4/librpc/wscript_build b/source4/librpc/wscript_build
index f11a516..463f010 100755
--- a/source4/librpc/wscript_build
+++ b/source4/librpc/wscript_build
@@ -93,7 +93,7 @@ bld.SAMBA_SUBSYSTEM('NDR_WINBIND',
 
 
 bld.SAMBA_LIBRARY('NDR_STANDARD',
-	source='../../librpc/gen_ndr/ndr_echo.c ../../librpc/ndr/ndr_netlogon.c ../../librpc/gen_ndr/ndr_netlogon.c ../../librpc/gen_ndr/ndr_dfs.c ../../librpc/gen_ndr/ndr_atsvc.c ../../librpc/gen_ndr/ndr_wkssvc.c ../../librpc/gen_ndr/ndr_srvsvc.c ../../librpc/ndr/ndr_svcctl.c ../../librpc/gen_ndr/ndr_svcctl.c ../../librpc/gen_ndr/ndr_winreg.c ../../librpc/gen_ndr/ndr_initshutdown.c ../../librpc/gen_ndr/ndr_eventlog.c ../../librpc/gen_ndr/ndr_ntsvcs.c',
+	source='../../librpc/gen_ndr/ndr_echo.c ../../librpc/ndr/ndr_netlogon.c ../../librpc/gen_ndr/ndr_netlogon.c ../../librpc/gen_ndr/ndr_dfs.c ../../librpc/gen_ndr/ndr_atsvc.c ../../librpc/gen_ndr/ndr_wkssvc.c ../../librpc/gen_ndr/ndr_srvsvc.c ../../librpc/ndr/ndr_svcctl.c ../../librpc/gen_ndr/ndr_svcctl.c ../../librpc/gen_ndr/ndr_winreg.c ../../librpc/gen_ndr/ndr_initshutdown.c ../../librpc/gen_ndr/ndr_eventlog.c ../../librpc/gen_ndr/ndr_ntsvcs.c ../../librpc/gen_ndr/ndr_eventlog6.c',
 	vnum='0.0.1',
 	pc_files='../../librpc/ndr_standard.pc',
 	deps='NDR_SECURITY NDR_LSARPC NDR_SAMR',
diff --git a/source4/param/loadparm.c b/source4/param/loadparm.c
index 95d2755..69dead7 100644
--- a/source4/param/loadparm.c
+++ b/source4/param/loadparm.c
@@ -2349,7 +2349,7 @@ struct loadparm_context *loadparm_init(TALLOC_CTX *mem_ctx)
 	lpcfg_do_global_parameter(lp_ctx, "ntvfs handler", "unixuid default");
 	lpcfg_do_global_parameter(lp_ctx, "max connections", "-1");
 
-	lpcfg_do_global_parameter(lp_ctx, "dcerpc endpoint servers", "epmapper srvsvc wkssvc rpcecho samr netlogon lsarpc spoolss drsuapi winreg dssetup unixinfo browser");
+	lpcfg_do_global_parameter(lp_ctx, "dcerpc endpoint servers", "epmapper srvsvc wkssvc rpcecho samr netlogon lsarpc spoolss drsuapi winreg dssetup unixinfo browser eventlog6");
 	lpcfg_do_global_parameter(lp_ctx, "server services", "smb rpc nbt wrepl ldap cldap kdc drepl winbind ntp_signd kcc dnsupdate");
 	lpcfg_do_global_parameter(lp_ctx, "ntptr providor", "simple_ldb");
 	/* the winbind method for domain controllers is for both RODC
diff --git a/source4/rpc_server/config.mk b/source4/rpc_server/config.mk
index 5ff1bd5..158c039 100644
--- a/source4/rpc_server/config.mk
+++ b/source4/rpc_server/config.mk
@@ -205,6 +205,20 @@ PRIVATE_DEPENDENCIES = \
 dcerpc_browser_OBJ_FILES = $(rpc_serversrcdir)/browser/dcesrv_browser.o
 
 ################################################
+# Start MODULE dcerpc_eventlog6
+[MODULE::dcerpc_eventlog6]
+INIT_FUNCTION = dcerpc_server_eventlog6_init
+SUBSYSTEM = dcerpc_server
+PRIVATE_DEPENDENCIES = \
+		SAMDB	\
+		DCERPC_COMMON	\
+		NDR_DRSUAPI
+# End MODULE dcerpc_eventlog6
+################################################
+
+dcerpc_browser_OBJ_FILES = $(rpc_serversrcdir)/eventlog/dcesrv_eventlog6.o
+
+################################################
 # Start SUBSYSTEM dcerpc_server
 [SUBSYSTEM::dcerpc_server]
 PRIVATE_DEPENDENCIES = \
diff --git a/source4/rpc_server/dcerpc_server.c b/source4/rpc_server/dcerpc_server.c
index 7bd8dca..927766c 100644
--- a/source4/rpc_server/dcerpc_server.c
+++ b/source4/rpc_server/dcerpc_server.c
@@ -1400,6 +1400,7 @@ void dcerpc_server_init(struct loadparm_context *lp_ctx)
 	extern NTSTATUS dcerpc_server_remote_init(void);
 	extern NTSTATUS dcerpc_server_lsa_init(void);
 	extern NTSTATUS dcerpc_server_browser_init(void);
+	extern NTSTATUS dcerpc_server_eventlog6_init(void);
 	init_module_fn static_init[] = { STATIC_dcerpc_server_MODULES };
 	init_module_fn *shared_init;
 
diff --git a/source4/rpc_server/eventlog/dcesrv_eventlog6.c b/source4/rpc_server/eventlog/dcesrv_eventlog6.c
new file mode 100644
index 0000000..26b0b49
--- /dev/null
+++ b/source4/rpc_server/eventlog/dcesrv_eventlog6.c
@@ -0,0 +1,323 @@
+/*
+   Unix SMB/CIFS implementation.
+
+   endpoint server for the eventlog6 pipe
+
+   Copyright (C) Anatoliy Atanasov 2010
+
+   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 3 of the License, or
+   (at your option) any later version.


-- 
Samba Shared Repository


More information about the samba-cvs mailing list