/* check the stored array length field */ _PUBLIC_ enum ndr_err_code ndr_check_array_length(struct ndr_pull *ndr, void *p, uint32_t length) { uint32_t stored; stored = ndr_token_peek(&ndr->array_length_list, p); if (stored != length) { return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array length - got %u expected %u\n", stored, length); } return NDR_ERR_SUCCESS; }
/* push a 'simple' full non-zero value if a pointer is non-NULL, otherwise 0 */ _PUBLIC_ enum ndr_err_code ndr_push_full_ptr(struct ndr_push *ndr, const void *p) { uint32_t ptr = 0; if (p) { /* Check if the pointer already exists and has an id */ ptr = ndr_token_peek(&ndr->full_ptr_list, p); if (ptr == 0) { ndr->ptr_count++; ptr = ndr->ptr_count; ndr_token_store(ndr, &ndr->full_ptr_list, p, ptr); } } return ndr_push_uint32(ndr, NDR_SCALARS, ptr); }
_PUBLIC_ NTSTATUS ndr_pull_WbemQualifier(struct ndr_pull *ndr, int ndr_flags, struct WbemQualifier *r) { uint32_t _ptr_name; TALLOC_CTX *_mem_save_name_0; if (ndr_flags & NDR_SCALARS) { NDR_CHECK(ndr_pull_align(ndr, 4)); NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_name)); if (_ptr_name != 0xFFFFFFFF) { NDR_PULL_ALLOC(ndr, r->name); NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->name, _ptr_name)); } else { r->name = NULL; } NDR_CHECK(ndr_pull_WBEM_FLAVOR_TYPE(ndr, NDR_SCALARS, &r->flavors)); NDR_CHECK(ndr_pull_CIMTYPE_ENUMERATION(ndr, NDR_SCALARS, &r->cimtype)); NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->value, r->cimtype & CIM_TYPEMASK)); NDR_CHECK(ndr_pull_CIMVAR(ndr, NDR_SCALARS, &r->value)); } if (ndr_flags & NDR_BUFFERS) { uint32_t relofs; relofs = ndr_token_peek(&ndr->relative_list, r->name); if (relofs & 0x80000000) { relofs &= 0xFF; if ((relofs < sizeof(qualifier_keys)/sizeof(qualifier_keys[0])) && qualifier_keys[relofs]) { r->name = talloc_strdup(ndr->current_mem_ctx, qualifier_keys[relofs]); } else { r->name = talloc_asprintf(ndr->current_mem_ctx, "%s%d", qn_unknown, relofs); } } else if (r->name) { struct ndr_pull_save _relative_save; ndr_pull_save(ndr, &_relative_save); NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->name)); _mem_save_name_0 = NDR_PULL_GET_MEM_CTX(ndr); NDR_PULL_SET_MEM_CTX(ndr, r->name, 0); NDR_CHECK(ndr_pull_CIMSTRING(ndr, NDR_SCALARS, &r->name)); NDR_PULL_SET_MEM_CTX(ndr, _mem_save_name_0, 0); ndr_pull_restore(ndr, &_relative_save); } NDR_CHECK(ndr_pull_CIMVAR(ndr, NDR_BUFFERS, &r->value)); } return NT_STATUS_OK; }
_PUBLIC_ uint32_t ndr_print_get_switch_value(struct ndr_print *ndr, const void *p) { return ndr_token_peek(&ndr->switch_list, p); }
/* get the stored array length field */ _PUBLIC_ uint32_t ndr_get_array_length(struct ndr_pull *ndr, const void *p) { return ndr_token_peek(&ndr->array_length_list, p); }