svn commit: samba r20278 - in branches/SAMBA_4_0/source/librpc: . idl ndr

metze at samba.org metze at samba.org
Wed Dec 20 13:05:15 GMT 2006


Author: metze
Date: 2006-12-20 13:05:13 +0000 (Wed, 20 Dec 2006)
New Revision: 20278

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=20278

Log:
make it possible to use oid strings in the drsuapi instead of uint8_t arrays
with ber encoded oid's

metze
Added:
   branches/SAMBA_4_0/source/librpc/ndr/ndr_drsuapi.h
Modified:
   branches/SAMBA_4_0/source/librpc/config.mk
   branches/SAMBA_4_0/source/librpc/idl/drsuapi.idl
   branches/SAMBA_4_0/source/librpc/ndr/ndr_drsuapi.c


Changeset:
Modified: branches/SAMBA_4_0/source/librpc/config.mk
===================================================================
--- branches/SAMBA_4_0/source/librpc/config.mk	2006-12-20 12:53:58 UTC (rev 20277)
+++ branches/SAMBA_4_0/source/librpc/config.mk	2006-12-20 13:05:13 UTC (rev 20278)
@@ -114,7 +114,7 @@
 VERSION = 0.0.1
 SO_VERSION = 0
 OBJ_FILES = gen_ndr/ndr_drsuapi.o ndr/ndr_drsuapi.o
-PUBLIC_DEPENDENCIES = LIBNDR NDR_COMPRESSION NDR_SECURITY NDR_SAMR
+PUBLIC_DEPENDENCIES = LIBNDR NDR_COMPRESSION NDR_SECURITY NDR_SAMR ASN1_UTIL
 
 [LIBRARY::NDR_DRSBLOBS]
 VERSION = 0.0.1

Modified: branches/SAMBA_4_0/source/librpc/idl/drsuapi.idl
===================================================================
--- branches/SAMBA_4_0/source/librpc/idl/drsuapi.idl	2006-12-20 12:53:58 UTC (rev 20277)
+++ branches/SAMBA_4_0/source/librpc/idl/drsuapi.idl	2006-12-20 13:05:13 UTC (rev 20278)
@@ -8,8 +8,9 @@
   endpoint("ncacn_np:[\\pipe\\lsass]","ncacn_np:[\\pipe\\protected_storage]", "ncacn_ip_tcp:", "ncalrpc:"),
   authservice("ldap"),
   helpstring("Active Directory Replication"),
+  helper("librpc/ndr/ndr_drsuapi.h"),
   pointer_default(unique)
-] 
+]
 interface drsuapi
 {
 	declare bitmap samr_GroupAttrs;
@@ -325,9 +326,9 @@
 	 *
 	 * 2.5.5.17	=> dom_sid
 	 */
-	typedef [flag(NDR_PAHEX)] struct {
-		[range(0,10000)] uint32 length;
-		[size_is(length)] uint8 *data;
+	typedef [nopush,nopull] struct {
+		[range(0,10000),value(ndr_size_drsuapi_DsReplicaOID_oid(r->oid, 0))] uint32 __ndr_size;
+		[size_is(__ndr_size),charset(DOS)] uint8 *oid; /* it's encoded with asn1_write_OID_String() */
 	} drsuapi_DsReplicaOID;
 
 	typedef struct {

Modified: branches/SAMBA_4_0/source/librpc/ndr/ndr_drsuapi.c
===================================================================
--- branches/SAMBA_4_0/source/librpc/ndr/ndr_drsuapi.c	2006-12-20 12:53:58 UTC (rev 20277)
+++ branches/SAMBA_4_0/source/librpc/ndr/ndr_drsuapi.c	2006-12-20 13:05:13 UTC (rev 20278)
@@ -24,6 +24,7 @@
 #include "includes.h"
 #include "librpc/gen_ndr/ndr_drsuapi.h"
 #include "librpc/gen_ndr/ndr_misc.h"
+#include "libcli/util/asn_1.h"
 
 void ndr_print_drsuapi_DsReplicaObjectListItem(struct ndr_print *ndr, const char *name, 
 					       const struct drsuapi_DsReplicaObjectListItem *r)
@@ -62,3 +63,108 @@
 		ndr_print_drsuapi_DsReplicaObjectListItemEx(ndr, "next_object", r->next_object);
 	}
 }
+
+#define _ASN1_PUSH_CHECK(call) do { \
+	BOOL _status; \
+	_status = call; \
+	if (_status != True) { \
+		return ndr_push_error(ndr, NDR_ERR_SUBCONTEXT, "ASN.1 Error: %s\n", __location__); \
+	} \
+} while (0)
+
+#define _ASN1_PULL_CHECK(call) do { \
+	BOOL _status; \
+	_status = call; \
+	if (_status != True) { \
+		return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, "ASN.1 Error: %s\n", __location__); \
+	} \
+} while (0)
+
+NTSTATUS ndr_push_drsuapi_DsReplicaOID(struct ndr_push *ndr, int ndr_flags, const struct drsuapi_DsReplicaOID *r)
+{
+	if (ndr_flags & NDR_SCALARS) {
+		NDR_CHECK(ndr_push_align(ndr, 4));
+		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_size_drsuapi_DsReplicaOID_oid(r->oid, 0)));
+		NDR_CHECK(ndr_push_unique_ptr(ndr, r->oid));
+	}
+	if (ndr_flags & NDR_BUFFERS) {
+		if (r->oid) {
+			struct asn1_data _asn1;
+
+			ZERO_STRUCT(_asn1);
+			_ASN1_PUSH_CHECK(asn1_write_OID_String(&_asn1, r->oid));
+			talloc_steal(ndr, _asn1.data);
+
+			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, _asn1.ofs));
+			NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, _asn1.data, _asn1.ofs));
+			asn1_free(&_asn1);
+		}
+	}
+	return NT_STATUS_OK;
+}
+
+NTSTATUS ndr_pull_drsuapi_DsReplicaOID(struct ndr_pull *ndr, int ndr_flags, struct drsuapi_DsReplicaOID *r)
+{
+	uint32_t _ptr_oid;
+	TALLOC_CTX *_mem_save_oid_0;
+	if (ndr_flags & NDR_SCALARS) {
+		NDR_CHECK(ndr_pull_align(ndr, 4));
+		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->__ndr_size));
+		if (r->__ndr_size < 0 || r->__ndr_size > 10000) {
+			return ndr_pull_error(ndr, NDR_ERR_RANGE, "value out of range");
+		}
+		NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_oid));
+		if (_ptr_oid) {
+			NDR_PULL_ALLOC(ndr, r->oid);
+		} else {
+			r->oid = NULL;
+		}
+	}
+	if (ndr_flags & NDR_BUFFERS) {
+		if (r->oid) {
+			DATA_BLOB _oid_array;
+			const char *_oid;
+			struct asn1_data _asn1;
+
+			ZERO_STRUCT(_asn1);
+
+			_mem_save_oid_0 = NDR_PULL_GET_MEM_CTX(ndr);
+			NDR_PULL_SET_MEM_CTX(ndr, ndr, 0);
+			NDR_CHECK(ndr_pull_array_size(ndr, &r->oid));
+			_oid_array.length = ndr_get_array_size(ndr, &r->oid);
+			NDR_PULL_ALLOC_N(ndr, _oid_array.data, _oid_array.length);
+			NDR_CHECK(ndr_pull_array_uint8(ndr, NDR_SCALARS, _oid_array.data, _oid_array.length));
+			NDR_PULL_SET_MEM_CTX(ndr, _mem_save_oid_0, 0);
+
+			_ASN1_PULL_CHECK(asn1_load(&_asn1, _oid_array));
+			talloc_steal(ndr, _asn1.data);
+			data_blob_free(&_oid_array);
+			_ASN1_PULL_CHECK(asn1_start_fake_tag(&_asn1));
+			_ASN1_PULL_CHECK(asn1_read_OID_String(&_asn1, &_oid));
+			talloc_steal(r->oid, _oid);
+			r->oid = _oid;
+			_ASN1_PULL_CHECK(asn1_end_tag(&_asn1));
+			asn1_free(&_asn1);
+		}
+		if (r->oid) {
+			NDR_CHECK(ndr_check_array_size(ndr, (void*)&r->oid, r->__ndr_size));
+		}
+	}
+	return NT_STATUS_OK;
+}
+
+size_t ndr_size_drsuapi_DsReplicaOID_oid(const char *oid, int flags)
+{
+	struct asn1_data _asn1;
+	size_t ret = 0;
+
+	if (!oid) return 0;
+
+	ZERO_STRUCT(_asn1);
+	if (asn1_write_OID_String(&_asn1, oid)) {
+		ret = _asn1.ofs;
+	}
+
+	asn1_free(&_asn1);
+	return ret;
+}

Added: branches/SAMBA_4_0/source/librpc/ndr/ndr_drsuapi.h
===================================================================
--- branches/SAMBA_4_0/source/librpc/ndr/ndr_drsuapi.h	2006-12-20 12:53:58 UTC (rev 20277)
+++ branches/SAMBA_4_0/source/librpc/ndr/ndr_drsuapi.h	2006-12-20 13:05:13 UTC (rev 20278)
@@ -0,0 +1,36 @@
+/* 
+   Unix SMB/CIFS implementation.
+
+   routines for printing some linked list structs in DRSUAPI
+
+   Copyright (C) Stefan (metze) Metzmacher 2005-2006
+
+   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.
+*/
+
+#ifndef _LIBRPC_NDR_NDR_DRSUAPI_H
+#define _LIBRPC_NDR_NDR_DRSUAPI_H
+
+void ndr_print_drsuapi_DsReplicaObjectListItem(struct ndr_print *ndr, const char *name, 
+					       const struct drsuapi_DsReplicaObjectListItem *r);
+
+void ndr_print_drsuapi_DsReplicaObjectListItemEx(struct ndr_print *ndr, const char *name,
+						 const struct drsuapi_DsReplicaObjectListItemEx *r);
+
+NTSTATUS ndr_push_drsuapi_DsReplicaOID(struct ndr_push *ndr, int ndr_flags, const struct drsuapi_DsReplicaOID *r);
+NTSTATUS ndr_pull_drsuapi_DsReplicaOID(struct ndr_pull *ndr, int ndr_flags, struct drsuapi_DsReplicaOID *r);
+size_t ndr_size_drsuapi_DsReplicaOID_oid(const char *oid, int flags);
+
+#endif /* _LIBRPC_NDR_NDR_DRSUAPI_H */



More information about the samba-cvs mailing list