static enum ndr_err_code ndr_push_echo_TestEnum(struct ndr_push *ndr, int flags, const struct echo_TestEnum *r) { if (flags & NDR_IN) { if (r->in.foo1 == NULL) { return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer"); } NDR_CHECK(ndr_push_echo_Enum1(ndr, NDR_SCALARS, *r->in.foo1)); if (r->in.foo2 == NULL) { return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer"); } NDR_CHECK(ndr_push_echo_Enum2(ndr, NDR_SCALARS, r->in.foo2)); if (r->in.foo3 == NULL) { return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer"); } NDR_CHECK(ndr_push_set_switch_value(ndr, r->in.foo3, *r->in.foo1)); NDR_CHECK(ndr_push_echo_Enum3(ndr, NDR_SCALARS, r->in.foo3)); } if (flags & NDR_OUT) { if (r->out.foo1 == NULL) { return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer"); } NDR_CHECK(ndr_push_echo_Enum1(ndr, NDR_SCALARS, *r->out.foo1)); if (r->out.foo2 == NULL) { return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer"); } NDR_CHECK(ndr_push_echo_Enum2(ndr, NDR_SCALARS, r->out.foo2)); if (r->out.foo3 == NULL) { return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer"); } NDR_CHECK(ndr_push_set_switch_value(ndr, r->out.foo3, *r->out.foo1)); NDR_CHECK(ndr_push_echo_Enum3(ndr, NDR_SCALARS, r->out.foo3)); } return NDR_ERR_SUCCESS; }
/* generic ndr_size_*() handler for unions */ _PUBLIC_ size_t ndr_size_union(const void *p, int flags, uint32_t level, ndr_push_flags_fn_t push, struct smb_iconv_convenience *iconv_convenience) { struct ndr_push *ndr; enum ndr_err_code status; size_t ret; /* avoid recursion */ if (flags & LIBNDR_FLAG_NO_NDR_SIZE) return 0; ndr = ndr_push_init_ctx(NULL, iconv_convenience); if (!ndr) return 0; ndr->flags |= flags | LIBNDR_FLAG_NO_NDR_SIZE; status = ndr_push_set_switch_value(ndr, p, level); if (!NDR_ERR_CODE_IS_SUCCESS(status)) { talloc_free(ndr); return 0; } status = push(ndr, NDR_SCALARS|NDR_BUFFERS, p); if (!NDR_ERR_CODE_IS_SUCCESS(status)) { talloc_free(ndr); return 0; } ret = ndr->offset; talloc_free(ndr); return ret; }
_PUBLIC_ enum ndr_err_code ndr_push_dnsp_DnssrvRpcRecord(struct ndr_push *ndr, int ndr_flags, const struct dnsp_DnssrvRpcRecord *r) { if (ndr_flags & NDR_SCALARS) { NDR_CHECK(ndr_push_align(ndr, 4)); NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, ndr_size_dnsRecordData(&r->data, r->wType, ndr->flags))); NDR_CHECK(ndr_push_dns_record_type(ndr, NDR_SCALARS, r->wType)); NDR_CHECK(ndr_push_uint8(ndr, NDR_SCALARS, 5)); NDR_CHECK(ndr_push_dns_record_rank(ndr, NDR_SCALARS, r->rank)); NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->flags)); NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->dwSerial)); { uint32_t _flags_save_uint32 = ndr->flags; ndr_set_flags(&ndr->flags, LIBNDR_FLAG_BIGENDIAN); NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->dwTtlSeconds)); ndr->flags = _flags_save_uint32; } NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->dwReserved)); NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->dwTimeStamp)); NDR_CHECK(ndr_push_set_switch_value(ndr, &r->data, r->wType)); NDR_CHECK(ndr_push_dnsRecordData(ndr, NDR_SCALARS, &r->data)); NDR_CHECK(ndr_push_trailer_align(ndr, 4)); } if (ndr_flags & NDR_BUFFERS) { } return NDR_ERR_SUCCESS; }
enum ndr_err_code ndr_push_PAC_BUFFER(struct ndr_push *ndr, int ndr_flags, const struct PAC_BUFFER *r) { if (ndr_flags & NDR_SCALARS) { NDR_CHECK(ndr_push_align(ndr, 4)); NDR_CHECK(ndr_push_PAC_TYPE(ndr, NDR_SCALARS, r->type)); NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, _ndr_size_PAC_INFO(r->info,r->type,ndr->iconv_convenience,0))); { uint32_t _flags_save_PAC_INFO = ndr->flags; ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN8); NDR_CHECK(ndr_push_relative_ptr1(ndr, r->info)); ndr->flags = _flags_save_PAC_INFO; } NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0)); } if (ndr_flags & NDR_BUFFERS) { { uint32_t _flags_save_PAC_INFO = ndr->flags; ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN8); if (r->info) { NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->info)); { struct ndr_push *_ndr_info; NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_info, 0, _subcontext_size_PAC_INFO(r->info,r->type,ndr->iconv_convenience, 0))); NDR_CHECK(ndr_push_set_switch_value(_ndr_info, r->info, r->type)); NDR_CHECK(ndr_push_PAC_INFO(_ndr_info, NDR_SCALARS|NDR_BUFFERS, r->info)); NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_info, 0, _subcontext_size_PAC_INFO(r->info,r->type,ndr->iconv_convenience,0))); } NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->info)); } ndr->flags = _flags_save_PAC_INFO; } } return NDR_ERR_SUCCESS; }
_PUBLIC_ enum ndr_err_code ndr_push_xattr_DOSATTRIB(struct ndr_push *ndr, int ndr_flags, const struct xattr_DOSATTRIB *r) { if (ndr_flags & NDR_SCALARS) { char *attrib_hex = NULL; attrib_hex = ndr_compat_xattr_attrib_hex(ndr, r); NDR_ERR_HAVE_NO_MEMORY(attrib_hex); NDR_CHECK(ndr_push_align(ndr, 4)); { uint32_t _flags_save_string = ndr->flags; ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_ASCII|LIBNDR_FLAG_STR_NULLTERM); NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, attrib_hex)); ndr->flags = _flags_save_string; } if (r->version == 0xFFFF) { return NDR_ERR_SUCCESS; } NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->version)); NDR_CHECK(ndr_push_set_switch_value(ndr, &r->info, r->version)); NDR_CHECK(ndr_push_xattr_DosInfo(ndr, NDR_SCALARS, &r->info)); } if (ndr_flags & NDR_BUFFERS) { } return NDR_ERR_SUCCESS; }
static NTSTATUS ndr_push_security_ace_object(struct ndr_push *ndr, int ndr_flags, const struct security_ace_object *r) { if (ndr_flags & NDR_SCALARS) { NDR_CHECK(ndr_push_align(ndr, 4)); NDR_CHECK(ndr_push_security_ace_object_flags(ndr, NDR_SCALARS, r->flags)); NDR_CHECK(ndr_push_set_switch_value(ndr, &r->type, r->flags&SEC_ACE_OBJECT_TYPE_PRESENT)); NDR_CHECK(ndr_push_security_ace_object_type(ndr, NDR_SCALARS, &r->type)); NDR_CHECK(ndr_push_set_switch_value(ndr, &r->inherited_type, r->flags&SEC_ACE_INHERITED_OBJECT_TYPE_PRESENT)); NDR_CHECK(ndr_push_security_ace_object_inherited_type(ndr, NDR_SCALARS, &r->inherited_type)); } if (ndr_flags & NDR_BUFFERS) { NDR_CHECK(ndr_push_security_ace_object_type(ndr, NDR_BUFFERS, &r->type)); NDR_CHECK(ndr_push_security_ace_object_inherited_type(ndr, NDR_BUFFERS, &r->inherited_type)); } return NT_STATUS_OK; }
_PUBLIC_ enum ndr_err_code ndr_push_witness_notifyResponse(struct ndr_push *ndr, int ndr_flags, const struct witness_notifyResponse *r) { uint32_t cntr_messages_0; { uint32_t _flags_save_STRUCT = ndr->flags; ndr_set_flags(&ndr->flags, LIBNDR_PRINT_ARRAY_HEX); NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); if (ndr_flags & NDR_SCALARS) { NDR_CHECK(ndr_push_align(ndr, 4)); NDR_CHECK(ndr_push_witness_notifyResponse_type(ndr, NDR_SCALARS, r->type)); NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_size_witness_notifyResponse(r, ndr->flags) - 20)); NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->num)); NDR_CHECK(ndr_push_unique_ptr(ndr, r->messages)); if (r->messages) { uint32_t _flags_save_witness_notifyResponse_message = ndr->flags; ndr_set_flags(&ndr->flags, LIBNDR_FLAG_REMAINING); { struct ndr_push *_ndr_messages; NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_messages, 4, ndr_size_witness_notifyResponse(r, ndr->flags) - 20)); for (cntr_messages_0 = 0; cntr_messages_0 < (r->num); cntr_messages_0++) { NDR_CHECK(ndr_push_set_switch_value(_ndr_messages, &r->messages[cntr_messages_0], r->type)); NDR_CHECK(ndr_push_witness_notifyResponse_message(_ndr_messages, NDR_SCALARS, &r->messages[cntr_messages_0])); } NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_messages, 4, ndr_size_witness_notifyResponse(r, ndr->flags) - 20)); } ndr->flags = _flags_save_witness_notifyResponse_message; } NDR_CHECK(ndr_push_trailer_align(ndr, 4)); } if (ndr_flags & NDR_BUFFERS) { } ndr->flags = _flags_save_STRUCT; } return NDR_ERR_SUCCESS; }
static enum ndr_err_code ndr_push_security_ace_object(struct ndr_push *ndr, int ndr_flags, const struct security_ace_object *r) { if (ndr_flags & NDR_SCALARS) { NDR_CHECK(ndr_push_align(ndr, 4)); NDR_CHECK(ndr_push_security_ace_object_flags(ndr, NDR_SCALARS, r->flags)); NDR_CHECK(ndr_push_set_switch_value(ndr, &r->type, r->flags & SEC_ACE_OBJECT_TYPE_PRESENT)); NDR_CHECK(ndr_push_security_ace_object_type(ndr, NDR_SCALARS, &r->type)); NDR_CHECK(ndr_push_set_switch_value(ndr, &r->inherited_type, r->flags & SEC_ACE_INHERITED_OBJECT_TYPE_PRESENT)); NDR_CHECK(ndr_push_security_ace_object_inherited_type(ndr, NDR_SCALARS, &r->inherited_type)); NDR_CHECK(ndr_push_trailer_align(ndr, 4)); } if (ndr_flags & NDR_BUFFERS) { NDR_CHECK(ndr_push_security_ace_object_type(ndr, NDR_BUFFERS, &r->type)); NDR_CHECK(ndr_push_security_ace_object_inherited_type(ndr, NDR_BUFFERS, &r->inherited_type)); } return NDR_ERR_SUCCESS; }
_PUBLIC_ enum ndr_err_code ndr_push_xattr_DosAttrib(struct ndr_push *ndr, int ndr_flags, const struct xattr_DosAttrib *r) { if (ndr_flags & NDR_SCALARS) { NDR_CHECK(ndr_push_align(ndr, 4)); NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->version)); NDR_CHECK(ndr_push_set_switch_value(ndr, &r->info, r->version)); NDR_CHECK(ndr_push_xattr_DosInfo(ndr, NDR_SCALARS, &r->info)); } if (ndr_flags & NDR_BUFFERS) { } return NDR_ERR_SUCCESS; }
static enum ndr_err_code ndr_push_echo_TestCall2(struct ndr_push *ndr, int flags, const struct echo_TestCall2 *r) { if (flags & NDR_IN) { NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->in.level)); } if (flags & NDR_OUT) { if (r->out.info == NULL) { return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer"); } NDR_CHECK(ndr_push_set_switch_value(ndr, r->out.info, r->in.level)); NDR_CHECK(ndr_push_echo_Info(ndr, NDR_SCALARS, r->out.info)); NDR_CHECK(ndr_push_NTSTATUS(ndr, NDR_SCALARS, r->out.result)); } return NDR_ERR_SUCCESS; }
static enum ndr_err_code ndr_push_dssetup_DsRoleGetPrimaryDomainInformation(struct ndr_push *ndr, int flags, const struct dssetup_DsRoleGetPrimaryDomainInformation *r) { if (flags & NDR_IN) { NDR_CHECK(ndr_push_dssetup_DsRoleInfoLevel(ndr, NDR_SCALARS, r->in.level)); } if (flags & NDR_OUT) { NDR_CHECK(ndr_push_unique_ptr(ndr, r->out.info)); if (r->out.info) { NDR_CHECK(ndr_push_set_switch_value(ndr, r->out.info, r->in.level)); NDR_CHECK(ndr_push_dssetup_DsRoleInfo(ndr, NDR_SCALARS|NDR_BUFFERS, r->out.info)); } NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result)); } return NDR_ERR_SUCCESS; }
/* push a union to a blob using NDR */ _PUBLIC_ enum ndr_err_code ndr_push_union_blob(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, void *p, uint32_t level, ndr_push_flags_fn_t fn) { struct ndr_push *ndr; ndr = ndr_push_init_ctx(mem_ctx, iconv_convenience); NDR_ERR_HAVE_NO_MEMORY(ndr); NDR_CHECK(ndr_push_set_switch_value(ndr, p, level)); NDR_CHECK(fn(ndr, NDR_SCALARS|NDR_BUFFERS, p)); *blob = ndr_push_blob(ndr); talloc_steal(mem_ctx, blob->data); talloc_free(ndr); return NDR_ERR_SUCCESS; }
NTSTATUS ndr_push_security_ace(struct ndr_push *ndr, int ndr_flags, const struct security_ace *r) { if (ndr_flags & NDR_SCALARS) { NDR_CHECK(ndr_push_align(ndr, 4)); NDR_CHECK(ndr_push_security_ace_type(ndr, NDR_SCALARS, r->type)); NDR_CHECK(ndr_push_security_ace_flags(ndr, NDR_SCALARS, r->flags)); NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, ndr_size_security_ace(r,ndr->flags))); NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->access_mask)); NDR_CHECK(ndr_push_set_switch_value(ndr, &r->object, r->type)); NDR_CHECK(ndr_push_security_ace_object_ctr(ndr, NDR_SCALARS, &r->object)); NDR_CHECK(ndr_push_dom_sid(ndr, NDR_SCALARS, &r->trustee)); } if (ndr_flags & NDR_BUFFERS) { NDR_CHECK(ndr_push_security_ace_object_ctr(ndr, NDR_BUFFERS, &r->object)); } return NT_STATUS_OK; }
_PUBLIC_ enum ndr_err_code ndr_push_security_ace(struct ndr_push *ndr, int ndr_flags, const struct security_ace *r) { if (ndr_flags & NDR_SCALARS) { NDR_CHECK(ndr_push_align(ndr, 4)); NDR_CHECK(ndr_push_security_ace_type(ndr, NDR_SCALARS, r->type)); NDR_CHECK(ndr_push_security_ace_flags(ndr, NDR_SCALARS, r->flags)); NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, ndr_size_security_ace(r, ndr->iconv_convenience, ndr->flags))); NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->access_mask)); NDR_CHECK(ndr_push_set_switch_value(ndr, &r->object, r->type)); NDR_CHECK(ndr_push_security_ace_object_ctr(ndr, NDR_SCALARS, &r->object)); NDR_CHECK(ndr_push_dom_sid(ndr, NDR_SCALARS, &r->trustee)); NDR_CHECK(ndr_push_trailer_align(ndr, 4)); } if (ndr_flags & NDR_BUFFERS) { NDR_CHECK(ndr_push_security_ace_object_ctr(ndr, NDR_BUFFERS, &r->object)); } return NDR_ERR_SUCCESS; }
_PUBLIC_ NTSTATUS ndr_push_WbemQualifier(struct ndr_push *ndr, int ndr_flags, const struct WbemQualifier *r) { if (ndr_flags & NDR_SCALARS) { NDR_CHECK(ndr_push_align(ndr, 4)); NDR_CHECK(ndr_push_relative_ptr1(ndr, r->name)); NDR_CHECK(ndr_push_WBEM_FLAVOR_TYPE(ndr, NDR_SCALARS, r->flavors)); NDR_CHECK(ndr_push_CIMTYPE_ENUMERATION(ndr, NDR_SCALARS, r->cimtype)); NDR_CHECK(ndr_push_set_switch_value(ndr, &r->value, r->cimtype & CIM_TYPEMASK)); NDR_CHECK(ndr_push_CIMVAR(ndr, NDR_SCALARS, &r->value)); } if (ndr_flags & NDR_BUFFERS) { if (r->name) { uint32_t ofs; int32_t i; for (i = 0; i < arr_sizeof(qualifier_keys); ++i) if (qualifier_keys[i] && !strcmp(r->name, qualifier_keys[i])) break; if (i == arr_sizeof(qualifier_keys)) { if (!strncmp(qn_unknown, r->name, sizeof(qn_unknown) - 1)) i = atoi(r->name + sizeof(qn_unknown) - 1); else i = -1; } if (i >= 0) { ofs = ndr->offset; NDR_CHECK(ndr_token_retrieve(&ndr->relative_list, r->name, &ndr->offset)); NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0x80000000 | i)); ndr->offset = ofs; } else { NDR_CHECK(ndr_push_relative_ptr2(ndr, r->name)); NDR_CHECK(ndr_push_CIMSTRING(ndr, NDR_SCALARS, &r->name)); } } NDR_CHECK(ndr_push_CIMVAR(ndr, NDR_BUFFERS, &r->value)); } return NT_STATUS_OK; }