root/librpc/ndr/ndr_drsuapi.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ndr_print_drsuapi_DsReplicaObjectListItem
  2. ndr_print_drsuapi_DsReplicaObjectListItemEx
  3. ndr_push_drsuapi_DsReplicaOID
  4. ndr_pull_drsuapi_DsReplicaOID
  5. ndr_size_drsuapi_DsReplicaOID_oid
  6. ndr_push_drsuapi_DsGetNCChangesMSZIPCtr1
  7. ndr_push_drsuapi_DsGetNCChangesMSZIPCtr6
  8. ndr_push_drsuapi_DsGetNCChangesXPRESSCtr1
  9. ndr_push_drsuapi_DsGetNCChangesXPRESSCtr6

   1 /*
   2    Unix SMB/CIFS implementation.
   3 
   4    routines for printing some linked list structs in DRSUAPI
   5 
   6    Copyright (C) Stefan (metze) Metzmacher 2005
   7 
   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.
  12 
  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.
  17 
  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/>.
  20 */
  21 
  22 
  23 #include "includes.h"
  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' */
  29 #undef strncasecmp
  30 
  31 void ndr_print_drsuapi_DsReplicaObjectListItem(struct ndr_print *ndr, const char *name,
     /* [<][>][^][v][top][bottom][index][help] */
  32                                                const struct drsuapi_DsReplicaObjectListItem *r)
  33 {
  34         ndr_print_struct(ndr, name, "drsuapi_DsReplicaObjectListItem");
  35         ndr->depth++;
  36         ndr_print_ptr(ndr, "next_object", r->next_object);
  37         ndr_print_drsuapi_DsReplicaObject(ndr, "object", &r->object);
  38         ndr->depth--;
  39         if (r->next_object) {
  40                 ndr_print_drsuapi_DsReplicaObjectListItem(ndr, "next_object", r->next_object);
  41         }
  42 }
  43 
  44 void ndr_print_drsuapi_DsReplicaObjectListItemEx(struct ndr_print *ndr, const char *name, const struct drsuapi_DsReplicaObjectListItemEx *r)
     /* [<][>][^][v][top][bottom][index][help] */
  45 {
  46         ndr_print_struct(ndr, name, "drsuapi_DsReplicaObjectListItemEx");
  47         ndr->depth++;
  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);
  52         ndr->depth++;
  53         if (r->parent_object_guid) {
  54                 ndr_print_GUID(ndr, "parent_object_guid", r->parent_object_guid);
  55         }
  56         ndr->depth--;
  57         ndr_print_ptr(ndr, "meta_data_ctr", r->meta_data_ctr);
  58         ndr->depth++;
  59         if (r->meta_data_ctr) {
  60                 ndr_print_drsuapi_DsReplicaMetaDataCtr(ndr, "meta_data_ctr", r->meta_data_ctr);
  61         }
  62         ndr->depth--;
  63         ndr->depth--;
  64         if (r->next_object) {
  65                 ndr_print_drsuapi_DsReplicaObjectListItemEx(ndr, "next_object", r->next_object);
  66         }
  67 }
  68 
  69 #define _OID_PUSH_CHECK(call) do { \
  70         bool _status; \
  71         _status = call; \
  72         if (_status != true) { \
  73                 return ndr_push_error(ndr, NDR_ERR_SUBCONTEXT, "OID Conversion Error: %s\n", __location__); \
  74         } \
  75 } while (0)
  76 
  77 #define _OID_PULL_CHECK(call) do { \
  78         bool _status; \
  79         _status = call; \
  80         if (_status != true) { \
  81                 return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, "OID Conversion Error: %s\n", __location__); \
  82         } \
  83 } while (0)
  84 
  85 enum ndr_err_code ndr_push_drsuapi_DsReplicaOID(struct ndr_push *ndr, int ndr_flags, const struct drsuapi_DsReplicaOID *r)
     /* [<][>][^][v][top][bottom][index][help] */
  86 {
  87         if (ndr_flags & NDR_SCALARS) {
  88                 NDR_CHECK(ndr_push_align(ndr, 4));
  89                 NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_size_drsuapi_DsReplicaOID_oid(r->oid, 0)));
  90                 NDR_CHECK(ndr_push_unique_ptr(ndr, r->oid));
  91         }
  92         if (ndr_flags & NDR_BUFFERS) {
  93                 if (r->oid) {
  94                         DATA_BLOB blob;
  95 
  96                         if (strncasecmp("ff", r->oid, 2) == 0) {
  97                                 blob = strhex_to_data_blob(ndr, r->oid);
  98                                 if (!blob.data) {
  99                                         return ndr_push_error(ndr, NDR_ERR_SUBCONTEXT,
 100                                                               "HEX String Conversion Error: %s\n",
 101                                                               __location__);
 102                                 }
 103                         } else {
 104                                 _OID_PUSH_CHECK(ber_write_OID_String(&blob, r->oid));
 105                         }
 106 
 107                         NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, blob.length));
 108                         NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, blob.data, blob.length));
 109                 }
 110         }
 111         return NDR_ERR_SUCCESS;
 112 }
 113 
 114 enum ndr_err_code ndr_pull_drsuapi_DsReplicaOID(struct ndr_pull *ndr, int ndr_flags, struct drsuapi_DsReplicaOID *r)
     /* [<][>][^][v][top][bottom][index][help] */
 115 {
 116         uint32_t _ptr_oid;
 117         TALLOC_CTX *_mem_save_oid_0;
 118         if (ndr_flags & NDR_SCALARS) {
 119                 NDR_CHECK(ndr_pull_align(ndr, 4));
 120                 NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->__ndr_size));
 121                 if (r->__ndr_size < 0 || r->__ndr_size > 10000) {
 122                         return ndr_pull_error(ndr, NDR_ERR_RANGE, "value out of range");
 123                 }
 124                 NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_oid));
 125                 if (_ptr_oid) {
 126                         NDR_PULL_ALLOC(ndr, r->oid);
 127                 } else {
 128                         r->oid = NULL;
 129                 }
 130         }
 131         if (ndr_flags & NDR_BUFFERS) {
 132                 if (r->oid) {
 133                         DATA_BLOB _oid_array;
 134                         const char *_oid;
 135 
 136                         _mem_save_oid_0 = NDR_PULL_GET_MEM_CTX(ndr);
 137                         NDR_PULL_SET_MEM_CTX(ndr, ndr, 0);
 138                         NDR_CHECK(ndr_pull_array_size(ndr, &r->oid));
 139                         _oid_array.length = ndr_get_array_size(ndr, &r->oid);
 140                         NDR_PULL_ALLOC_N(ndr, _oid_array.data, _oid_array.length);
 141                         NDR_CHECK(ndr_pull_array_uint8(ndr, NDR_SCALARS, _oid_array.data, _oid_array.length));
 142                         NDR_PULL_SET_MEM_CTX(ndr, _mem_save_oid_0, 0);
 143 
 144                         if (_oid_array.length && _oid_array.data[0] == 0xFF) {
 145                                 _oid = data_blob_hex_string(ndr, &_oid_array);
 146                                 NDR_ERR_HAVE_NO_MEMORY(_oid);
 147                         } else {
 148                                 _OID_PULL_CHECK(ber_read_OID_String(ndr, _oid_array, &_oid));
 149                         }
 150                         data_blob_free(&_oid_array);
 151                         talloc_steal(r->oid, _oid);
 152                         r->oid = _oid;
 153                 }
 154                 if (r->oid) {
 155                         NDR_CHECK(ndr_check_array_size(ndr, (void*)&r->oid, r->__ndr_size));
 156                 }
 157         }
 158         return NDR_ERR_SUCCESS;
 159 }
 160 
 161 size_t ndr_size_drsuapi_DsReplicaOID_oid(const char *oid, int flags)
     /* [<][>][^][v][top][bottom][index][help] */
 162 {
 163         DATA_BLOB _blob;
 164         size_t ret = 0;
 165 
 166         if (!oid) return 0;
 167 
 168         if (strncasecmp("ff", oid, 2) == 0) {
 169                 _blob = strhex_to_data_blob(NULL, oid);
 170                 if (_blob.data) {
 171                         ret = _blob.length;
 172                 }
 173         } else {
 174                 if (ber_write_OID_String(&_blob, oid)) {
 175                         ret = _blob.length;
 176                 }
 177         }
 178         data_blob_free(&_blob);
 179         return ret;
 180 }
 181 
 182 enum ndr_err_code ndr_push_drsuapi_DsGetNCChangesMSZIPCtr1(struct ndr_push *ndr, int ndr_flags, const struct drsuapi_DsGetNCChangesMSZIPCtr1 *r)
     /* [<][>][^][v][top][bottom][index][help] */
 183 {
 184         if (ndr_flags & NDR_SCALARS) {
 185                 uint32_t decompressed_length = 0;
 186                 uint32_t compressed_length = 0;
 187                 if (r->ts) {
 188                         {
 189                                 struct ndr_push *_ndr_ts;
 190                                 NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_ts, 4, -1));
 191                                 {
 192                                         struct ndr_push *_ndr_ts_compressed;
 193                                         NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed, NDR_COMPRESSION_MSZIP, -1));
 194                                         NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr1TS(_ndr_ts_compressed, NDR_SCALARS|NDR_BUFFERS, r->ts));
 195                                         decompressed_length = _ndr_ts_compressed->offset;
 196                                         NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed, NDR_COMPRESSION_MSZIP, -1));
 197                                 }
 198                                 compressed_length = _ndr_ts->offset;
 199                                 talloc_free(_ndr_ts);
 200                         }
 201                 }
 202                 NDR_CHECK(ndr_push_align(ndr, 4));
 203                 NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, decompressed_length));
 204                 NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, compressed_length));
 205                 NDR_CHECK(ndr_push_unique_ptr(ndr, r->ts));
 206         }
 207         if (ndr_flags & NDR_BUFFERS) {
 208                 if (r->ts) {
 209                         {
 210                                 struct ndr_push *_ndr_ts;
 211                                 NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_ts, 4, -1));
 212                                 {
 213                                         struct ndr_push *_ndr_ts_compressed;
 214                                         NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed, NDR_COMPRESSION_MSZIP, -1));
 215                                         NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr1TS(_ndr_ts_compressed, NDR_SCALARS|NDR_BUFFERS, r->ts));
 216                                         NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed, NDR_COMPRESSION_MSZIP, -1));
 217                                 }
 218                                 NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_ts, 4, -1));
 219                         }
 220                 }
 221         }
 222         return NDR_ERR_SUCCESS;
 223 }
 224 
 225 enum ndr_err_code ndr_push_drsuapi_DsGetNCChangesMSZIPCtr6(struct ndr_push *ndr, int ndr_flags, const struct drsuapi_DsGetNCChangesMSZIPCtr6 *r)
     /* [<][>][^][v][top][bottom][index][help] */
 226 {
 227         if (ndr_flags & NDR_SCALARS) {
 228                 uint32_t decompressed_length = 0;
 229                 uint32_t compressed_length = 0;
 230                 if (r->ts) {
 231                         {
 232                                 struct ndr_push *_ndr_ts;
 233                                 NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_ts, 4, -1));
 234                                 {
 235                                         struct ndr_push *_ndr_ts_compressed;
 236                                         NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed, NDR_COMPRESSION_MSZIP, -1));
 237                                         NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr6TS(_ndr_ts_compressed, NDR_SCALARS|NDR_BUFFERS, r->ts));
 238                                         decompressed_length = _ndr_ts_compressed->offset;
 239                                         NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed, NDR_COMPRESSION_MSZIP, -1));
 240                                 }
 241                                 compressed_length = _ndr_ts->offset;
 242                                 talloc_free(_ndr_ts);
 243                         }
 244                 }
 245                 NDR_CHECK(ndr_push_align(ndr, 4));
 246                 NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, decompressed_length));
 247                 NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, compressed_length));
 248                 NDR_CHECK(ndr_push_unique_ptr(ndr, r->ts));
 249         }
 250         if (ndr_flags & NDR_BUFFERS) {
 251                 if (r->ts) {
 252                         {
 253                                 struct ndr_push *_ndr_ts;
 254                                 NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_ts, 4, -1));
 255                                 {
 256                                         struct ndr_push *_ndr_ts_compressed;
 257                                         NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed, NDR_COMPRESSION_MSZIP, -1));
 258                                         NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr6TS(_ndr_ts_compressed, NDR_SCALARS|NDR_BUFFERS, r->ts));
 259                                         NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed, NDR_COMPRESSION_MSZIP, -1));
 260                                 }
 261                                 NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_ts, 4, -1));
 262                         }
 263                 }
 264         }
 265         return NDR_ERR_SUCCESS;
 266 }
 267 
 268 enum ndr_err_code ndr_push_drsuapi_DsGetNCChangesXPRESSCtr1(struct ndr_push *ndr, int ndr_flags, const struct drsuapi_DsGetNCChangesXPRESSCtr1 *r)
     /* [<][>][^][v][top][bottom][index][help] */
 269 {
 270         if (ndr_flags & NDR_SCALARS) {
 271                 uint32_t decompressed_length = 0;
 272                 uint32_t compressed_length = 0;
 273                 if (r->ts) {
 274                         {
 275                                 struct ndr_push *_ndr_ts;
 276                                 NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_ts, 4, -1));
 277                                 {
 278                                         struct ndr_push *_ndr_ts_compressed;
 279                                         NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed, NDR_COMPRESSION_XPRESS, -1));
 280                                         NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr1TS(_ndr_ts_compressed, NDR_SCALARS|NDR_BUFFERS, r->ts));
 281                                         decompressed_length = _ndr_ts_compressed->offset;
 282                                         NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed, NDR_COMPRESSION_XPRESS, -1));
 283                                 }
 284                                 compressed_length = _ndr_ts->offset;
 285                                 talloc_free(_ndr_ts);
 286                         }
 287                 }
 288                 NDR_CHECK(ndr_push_align(ndr, 4));
 289                 NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, decompressed_length));
 290                 NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, compressed_length));
 291                 NDR_CHECK(ndr_push_unique_ptr(ndr, r->ts));
 292         }
 293         if (ndr_flags & NDR_BUFFERS) {
 294                 if (r->ts) {
 295                         {
 296                                 struct ndr_push *_ndr_ts;
 297                                 NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_ts, 4, -1));
 298                                 {
 299                                         struct ndr_push *_ndr_ts_compressed;
 300                                         NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed, NDR_COMPRESSION_XPRESS, -1));
 301                                         NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr1TS(_ndr_ts_compressed, NDR_SCALARS|NDR_BUFFERS, r->ts));
 302                                         NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed, NDR_COMPRESSION_XPRESS, -1));
 303                                 }
 304                                 NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_ts, 4, -1));
 305                         }
 306                 }
 307         }
 308         return NDR_ERR_SUCCESS;
 309 }
 310 
 311 enum ndr_err_code ndr_push_drsuapi_DsGetNCChangesXPRESSCtr6(struct ndr_push *ndr, int ndr_flags, const struct drsuapi_DsGetNCChangesXPRESSCtr6 *r)
     /* [<][>][^][v][top][bottom][index][help] */
 312 {
 313         if (ndr_flags & NDR_SCALARS) {
 314                 uint32_t decompressed_length = 0;
 315                 uint32_t compressed_length = 0;
 316                 if (r->ts) {
 317                         {
 318                                 struct ndr_push *_ndr_ts;
 319                                 NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_ts, 4, -1));
 320                                 {
 321                                         struct ndr_push *_ndr_ts_compressed;
 322                                         NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed, NDR_COMPRESSION_XPRESS, -1));
 323                                         NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr6TS(_ndr_ts_compressed, NDR_SCALARS|NDR_BUFFERS, r->ts));
 324                                         decompressed_length = _ndr_ts_compressed->offset;
 325                                         NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed, NDR_COMPRESSION_XPRESS, -1));
 326                                 }
 327                                 compressed_length = _ndr_ts->offset;
 328                                 talloc_free(_ndr_ts);
 329                         }
 330                 }
 331                 NDR_CHECK(ndr_push_align(ndr, 4));
 332                 NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, decompressed_length));
 333                 NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, compressed_length));
 334                 NDR_CHECK(ndr_push_unique_ptr(ndr, r->ts));
 335         }
 336         if (ndr_flags & NDR_BUFFERS) {
 337                 if (r->ts) {
 338                         {
 339                                 struct ndr_push *_ndr_ts;
 340                                 NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_ts, 4, -1));
 341                                 {
 342                                         struct ndr_push *_ndr_ts_compressed;
 343                                         NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed, NDR_COMPRESSION_XPRESS, -1));
 344                                         NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr6TS(_ndr_ts_compressed, NDR_SCALARS|NDR_BUFFERS, r->ts));
 345                                         NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed, NDR_COMPRESSION_XPRESS, -1));
 346                                 }
 347                                 NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_ts, 4, -1));
 348                         }
 349                 }
 350         }
 351         return NDR_ERR_SUCCESS;
 352 }

/* [<][>][^][v][top][bottom][index][help] */