2 Unix SMB/CIFS implementation.
4 routines for printing some linked list structs in DRSUAPI
6 Copyright (C) Stefan (metze) Metzmacher 2005
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
24 #include "librpc/gen_ndr/ndr_drsuapi.h"
25 #include "librpc/gen_ndr/ndr_misc.h"
26 #include "../lib/util/asn1.h"
27 #include "librpc/ndr/ndr_compression.h"
28 /* We don't need multibyte if we're just comparing to 'ff' */
31 void ndr_print_drsuapi_DsReplicaObjectListItem(struct ndr_print
*ndr
, const char *name
,
32 const struct drsuapi_DsReplicaObjectListItem
*r
)
34 ndr_print_struct(ndr
, name
, "drsuapi_DsReplicaObjectListItem");
36 ndr_print_ptr(ndr
, "next_object", r
->next_object
);
37 ndr_print_drsuapi_DsReplicaObject(ndr
, "object", &r
->object
);
40 ndr_print_drsuapi_DsReplicaObjectListItem(ndr
, "next_object", r
->next_object
);
44 void ndr_print_drsuapi_DsReplicaObjectListItemEx(struct ndr_print
*ndr
, const char *name
, const struct drsuapi_DsReplicaObjectListItemEx
*r
)
46 ndr_print_struct(ndr
, name
, "drsuapi_DsReplicaObjectListItemEx");
48 ndr_print_ptr(ndr
, "next_object", r
->next_object
);
49 ndr_print_drsuapi_DsReplicaObject(ndr
, "object", &r
->object
);
50 ndr_print_uint32(ndr
, "is_nc_prefix", r
->is_nc_prefix
);
51 ndr_print_ptr(ndr
, "parent_object_guid", r
->parent_object_guid
);
53 if (r
->parent_object_guid
) {
54 ndr_print_GUID(ndr
, "parent_object_guid", r
->parent_object_guid
);
57 ndr_print_ptr(ndr
, "meta_data_ctr", r
->meta_data_ctr
);
59 if (r
->meta_data_ctr
) {
60 ndr_print_drsuapi_DsReplicaMetaDataCtr(ndr
, "meta_data_ctr", r
->meta_data_ctr
);
65 ndr_print_drsuapi_DsReplicaObjectListItemEx(ndr
, "next_object", r
->next_object
);
69 #define _OID_PUSH_CHECK(call) do { \
72 if (_status != true) { \
73 return ndr_push_error(ndr, NDR_ERR_SUBCONTEXT, "OID Conversion Error: %s\n", __location__); \
77 #define _OID_PULL_CHECK(call) do { \
80 if (_status != true) { \
81 return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, "OID Conversion Error: %s\n", __location__); \
85 _PUBLIC_
void ndr_print_drsuapi_DsReplicaOID(struct ndr_print
*ndr
, const char *name
, const struct drsuapi_DsReplicaOID
*r
)
87 ndr_print_struct(ndr
, name
, "drsuapi_DsReplicaOID");
89 ndr_print_uint32(ndr
, "length", r
->length
);
90 ndr
->print(ndr
, "%-25s: length=%u", "oid", r
->length
);
92 char *partial_oid
= NULL
;
93 DATA_BLOB oid_blob
= data_blob_const(r
->binary_oid
, r
->length
);
94 char *hex_str
= data_blob_hex_string_upper(ndr
, &oid_blob
);
95 ber_read_partial_OID_String(ndr
, oid_blob
, (const char **)&partial_oid
);
97 ndr
->print(ndr
, "%-25s: 0x%s (%s)", "binary_oid", hex_str
, partial_oid
);
100 talloc_free(partial_oid
);
105 enum ndr_err_code
ndr_push_drsuapi_DsGetNCChangesMSZIPCtr1(struct ndr_push
*ndr
, int ndr_flags
, const struct drsuapi_DsGetNCChangesMSZIPCtr1
*r
)
107 if (ndr_flags
& NDR_SCALARS
) {
108 uint32_t decompressed_length
= 0;
109 uint32_t compressed_length
= 0;
112 struct ndr_push
*_ndr_ts
;
113 NDR_CHECK(ndr_push_subcontext_start(ndr
, &_ndr_ts
, 4, -1));
115 struct ndr_push
*_ndr_ts_compressed
;
116 NDR_CHECK(ndr_push_compression_start(_ndr_ts
, &_ndr_ts_compressed
, NDR_COMPRESSION_MSZIP
, -1));
117 NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr1TS(_ndr_ts_compressed
, NDR_SCALARS
|NDR_BUFFERS
, r
->ts
));
118 decompressed_length
= _ndr_ts_compressed
->offset
;
119 NDR_CHECK(ndr_push_compression_end(_ndr_ts
, _ndr_ts_compressed
, NDR_COMPRESSION_MSZIP
, -1));
121 compressed_length
= _ndr_ts
->offset
;
122 talloc_free(_ndr_ts
);
125 NDR_CHECK(ndr_push_align(ndr
, 4));
126 NDR_CHECK(ndr_push_uint32(ndr
, NDR_SCALARS
, decompressed_length
));
127 NDR_CHECK(ndr_push_uint32(ndr
, NDR_SCALARS
, compressed_length
));
128 NDR_CHECK(ndr_push_unique_ptr(ndr
, r
->ts
));
130 if (ndr_flags
& NDR_BUFFERS
) {
133 struct ndr_push
*_ndr_ts
;
134 NDR_CHECK(ndr_push_subcontext_start(ndr
, &_ndr_ts
, 4, -1));
136 struct ndr_push
*_ndr_ts_compressed
;
137 NDR_CHECK(ndr_push_compression_start(_ndr_ts
, &_ndr_ts_compressed
, NDR_COMPRESSION_MSZIP
, -1));
138 NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr1TS(_ndr_ts_compressed
, NDR_SCALARS
|NDR_BUFFERS
, r
->ts
));
139 NDR_CHECK(ndr_push_compression_end(_ndr_ts
, _ndr_ts_compressed
, NDR_COMPRESSION_MSZIP
, -1));
141 NDR_CHECK(ndr_push_subcontext_end(ndr
, _ndr_ts
, 4, -1));
145 return NDR_ERR_SUCCESS
;
148 enum ndr_err_code
ndr_push_drsuapi_DsGetNCChangesMSZIPCtr6(struct ndr_push
*ndr
, int ndr_flags
, const struct drsuapi_DsGetNCChangesMSZIPCtr6
*r
)
150 if (ndr_flags
& NDR_SCALARS
) {
151 uint32_t decompressed_length
= 0;
152 uint32_t compressed_length
= 0;
155 struct ndr_push
*_ndr_ts
;
156 NDR_CHECK(ndr_push_subcontext_start(ndr
, &_ndr_ts
, 4, -1));
158 struct ndr_push
*_ndr_ts_compressed
;
159 NDR_CHECK(ndr_push_compression_start(_ndr_ts
, &_ndr_ts_compressed
, NDR_COMPRESSION_MSZIP
, -1));
160 NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr6TS(_ndr_ts_compressed
, NDR_SCALARS
|NDR_BUFFERS
, r
->ts
));
161 decompressed_length
= _ndr_ts_compressed
->offset
;
162 NDR_CHECK(ndr_push_compression_end(_ndr_ts
, _ndr_ts_compressed
, NDR_COMPRESSION_MSZIP
, -1));
164 compressed_length
= _ndr_ts
->offset
;
165 talloc_free(_ndr_ts
);
168 NDR_CHECK(ndr_push_align(ndr
, 4));
169 NDR_CHECK(ndr_push_uint32(ndr
, NDR_SCALARS
, decompressed_length
));
170 NDR_CHECK(ndr_push_uint32(ndr
, NDR_SCALARS
, compressed_length
));
171 NDR_CHECK(ndr_push_unique_ptr(ndr
, r
->ts
));
173 if (ndr_flags
& NDR_BUFFERS
) {
176 struct ndr_push
*_ndr_ts
;
177 NDR_CHECK(ndr_push_subcontext_start(ndr
, &_ndr_ts
, 4, -1));
179 struct ndr_push
*_ndr_ts_compressed
;
180 NDR_CHECK(ndr_push_compression_start(_ndr_ts
, &_ndr_ts_compressed
, NDR_COMPRESSION_MSZIP
, -1));
181 NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr6TS(_ndr_ts_compressed
, NDR_SCALARS
|NDR_BUFFERS
, r
->ts
));
182 NDR_CHECK(ndr_push_compression_end(_ndr_ts
, _ndr_ts_compressed
, NDR_COMPRESSION_MSZIP
, -1));
184 NDR_CHECK(ndr_push_subcontext_end(ndr
, _ndr_ts
, 4, -1));
188 return NDR_ERR_SUCCESS
;
191 enum ndr_err_code
ndr_push_drsuapi_DsGetNCChangesXPRESSCtr1(struct ndr_push
*ndr
, int ndr_flags
, const struct drsuapi_DsGetNCChangesXPRESSCtr1
*r
)
193 if (ndr_flags
& NDR_SCALARS
) {
194 uint32_t decompressed_length
= 0;
195 uint32_t compressed_length
= 0;
198 struct ndr_push
*_ndr_ts
;
199 NDR_CHECK(ndr_push_subcontext_start(ndr
, &_ndr_ts
, 4, -1));
201 struct ndr_push
*_ndr_ts_compressed
;
202 NDR_CHECK(ndr_push_compression_start(_ndr_ts
, &_ndr_ts_compressed
, NDR_COMPRESSION_XPRESS
, -1));
203 NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr1TS(_ndr_ts_compressed
, NDR_SCALARS
|NDR_BUFFERS
, r
->ts
));
204 decompressed_length
= _ndr_ts_compressed
->offset
;
205 NDR_CHECK(ndr_push_compression_end(_ndr_ts
, _ndr_ts_compressed
, NDR_COMPRESSION_XPRESS
, -1));
207 compressed_length
= _ndr_ts
->offset
;
208 talloc_free(_ndr_ts
);
211 NDR_CHECK(ndr_push_align(ndr
, 4));
212 NDR_CHECK(ndr_push_uint32(ndr
, NDR_SCALARS
, decompressed_length
));
213 NDR_CHECK(ndr_push_uint32(ndr
, NDR_SCALARS
, compressed_length
));
214 NDR_CHECK(ndr_push_unique_ptr(ndr
, r
->ts
));
216 if (ndr_flags
& NDR_BUFFERS
) {
219 struct ndr_push
*_ndr_ts
;
220 NDR_CHECK(ndr_push_subcontext_start(ndr
, &_ndr_ts
, 4, -1));
222 struct ndr_push
*_ndr_ts_compressed
;
223 NDR_CHECK(ndr_push_compression_start(_ndr_ts
, &_ndr_ts_compressed
, NDR_COMPRESSION_XPRESS
, -1));
224 NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr1TS(_ndr_ts_compressed
, NDR_SCALARS
|NDR_BUFFERS
, r
->ts
));
225 NDR_CHECK(ndr_push_compression_end(_ndr_ts
, _ndr_ts_compressed
, NDR_COMPRESSION_XPRESS
, -1));
227 NDR_CHECK(ndr_push_subcontext_end(ndr
, _ndr_ts
, 4, -1));
231 return NDR_ERR_SUCCESS
;
234 enum ndr_err_code
ndr_push_drsuapi_DsGetNCChangesXPRESSCtr6(struct ndr_push
*ndr
, int ndr_flags
, const struct drsuapi_DsGetNCChangesXPRESSCtr6
*r
)
236 if (ndr_flags
& NDR_SCALARS
) {
237 uint32_t decompressed_length
= 0;
238 uint32_t compressed_length
= 0;
241 struct ndr_push
*_ndr_ts
;
242 NDR_CHECK(ndr_push_subcontext_start(ndr
, &_ndr_ts
, 4, -1));
244 struct ndr_push
*_ndr_ts_compressed
;
245 NDR_CHECK(ndr_push_compression_start(_ndr_ts
, &_ndr_ts_compressed
, NDR_COMPRESSION_XPRESS
, -1));
246 NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr6TS(_ndr_ts_compressed
, NDR_SCALARS
|NDR_BUFFERS
, r
->ts
));
247 decompressed_length
= _ndr_ts_compressed
->offset
;
248 NDR_CHECK(ndr_push_compression_end(_ndr_ts
, _ndr_ts_compressed
, NDR_COMPRESSION_XPRESS
, -1));
250 compressed_length
= _ndr_ts
->offset
;
251 talloc_free(_ndr_ts
);
254 NDR_CHECK(ndr_push_align(ndr
, 4));
255 NDR_CHECK(ndr_push_uint32(ndr
, NDR_SCALARS
, decompressed_length
));
256 NDR_CHECK(ndr_push_uint32(ndr
, NDR_SCALARS
, compressed_length
));
257 NDR_CHECK(ndr_push_unique_ptr(ndr
, r
->ts
));
259 if (ndr_flags
& NDR_BUFFERS
) {
262 struct ndr_push
*_ndr_ts
;
263 NDR_CHECK(ndr_push_subcontext_start(ndr
, &_ndr_ts
, 4, -1));
265 struct ndr_push
*_ndr_ts_compressed
;
266 NDR_CHECK(ndr_push_compression_start(_ndr_ts
, &_ndr_ts_compressed
, NDR_COMPRESSION_XPRESS
, -1));
267 NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr6TS(_ndr_ts_compressed
, NDR_SCALARS
|NDR_BUFFERS
, r
->ts
));
268 NDR_CHECK(ndr_push_compression_end(_ndr_ts
, _ndr_ts_compressed
, NDR_COMPRESSION_XPRESS
, -1));
270 NDR_CHECK(ndr_push_subcontext_end(ndr
, _ndr_ts
, 4, -1));
274 return NDR_ERR_SUCCESS
;
277 _PUBLIC_
size_t ndr_size_drsuapi_DsReplicaObjectIdentifier3Binary_without_Binary(const struct drsuapi_DsReplicaObjectIdentifier3Binary
*r
, struct smb_iconv_convenience
*ic
, int flags
)
279 return ndr_size_struct((const struct drsuapi_DsReplicaObjectIdentifier3
*)r
, flags
, (ndr_push_flags_fn_t
)ndr_push_drsuapi_DsReplicaObjectIdentifier3
, ic
);