r9509: start to fix the pushing of drsuapi_DsAttributeValueDNString structs,
authorStefan Metzmacher <metze@samba.org>
Tue, 23 Aug 2005 09:28:37 +0000 (09:28 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:34:24 +0000 (13:34 -0500)
this uses a trick with talloc_get_type() to workaround using [value()] vars
in [subcontext_size()]

metze
(This used to be commit 93065f2d3439bceeaa7c2a09679cc6d81472150d)

source4/include/structs.h
source4/librpc/idl/drsuapi.idl
source4/librpc/ndr/ndr_drsuapi.c

index 5c6ef29774b9adfc7f697fa32806a271d15a0fc9..eec211cec3ef63ae7bc1ee1dfb7c2c16d2e60f50 100644 (file)
@@ -77,8 +77,11 @@ struct spoolss_DeviceMode;
 struct ntptr_context;
 struct ntptr_GenericHandle;
 
+struct drsuapi_DsCrackNames;
 struct drsuapi_DsReplicaObjectListItem;
 struct drsuapi_DsReplicaObjectListItemEx;
+struct drsuapi_DsAttributeValueDNString;
+struct drsuapi_DsReplicaObjectIdentifier3;
 
 struct MULTI_QI;
 struct COSERVERINFO;
@@ -87,8 +90,6 @@ struct COSERVERINFO;
 struct epm_floor;
 struct epm_tower;
 
-struct drsuapi_DsCrackNames;
-
 struct PAC_BUFFER;
 struct PAC_DATA;
 
index a9ecd30cb51ab86570409bdecff567890d63771f..10170bc2820a0ad828b24a8445bf9c4991f72757 100644 (file)
@@ -428,16 +428,16 @@ interface drsuapi
 
        /* DN String values */
        typedef [gensize] struct {
-               [value(ndr_size_drsuapi_DsReplicaObjectIdentifier3(r, ndr->flags)-4)] uint32 __ndr_size;
+               [value(ndr_size_drsuapi_DsReplicaObjectIdentifier3(r, ndr->flags))] uint32 __ndr_size;
                [value(ndr_length_dom_sid(&r->sid))]  uint32 __ndr_size_sid;
                GUID guid;
                dom_sid28 sid;
                [flag(STR_SIZE4|STR_CHARLEN)] string dn;
        } drsuapi_DsReplicaObjectIdentifier3;
 
-       typedef  struct {
-               [range(0,10485760)] uint32 length;
-               [subcontext(4)] drsuapi_DsReplicaObjectIdentifier3 *object;
+       typedef struct {
+               [range(0,10485760),value(_ndr_size_drsuapi_DsReplicaObjectIdentifier3(ndr, r, object, ndr->flags))] uint32 __ndr_size;
+               [subcontext(4),subcontext_size(_ndr_size_drsuapi_DsReplicaObjectIdentifier3(ndr, r, object, ndr->flags))] drsuapi_DsReplicaObjectIdentifier3 *object;
        } drsuapi_DsAttributeValueDNString;
 
        typedef struct {
index 6f6dd74ea4adf4365148b5541b6cda1a2e94fdfc..f220966b9d6d18cc8dc9a7a6c6027fce64dd47c9 100644 (file)
@@ -61,3 +61,18 @@ void ndr_print_drsuapi_DsReplicaObjectListItemEx(struct ndr_print *ndr, const ch
                ndr_print_drsuapi_DsReplicaObjectListItemEx(ndr, "next_object", r->next_object);
        }
 }
+
+uint32_t _ndr_size_drsuapi_DsReplicaObjectIdentifier3(const void *ndr,
+                                                     const struct drsuapi_DsAttributeValueDNString *dn,
+                                                     const struct drsuapi_DsReplicaObjectIdentifier3 *id,
+                                                     uint32_t flags)
+{
+       if (talloc_get_type(ndr, struct ndr_pull)) {
+               return dn->__ndr_size;
+       } else if (talloc_get_type(ndr, struct ndr_push)) {
+               return ndr_size_drsuapi_DsReplicaObjectIdentifier3(id, flags) + 2;
+       } else if  (talloc_get_type(ndr, struct ndr_print)) {
+               return ndr_size_drsuapi_DsReplicaObjectIdentifier3(id, flags) + 2;
+       }
+       return 0;
+}