static WERROR sptr_GetPrintServerData(struct ntptr_GenericHandle *server, TALLOC_CTX *mem_ctx, struct spoolss_GetPrinterData *r) { WERROR result; union spoolss_PrinterData data; DATA_BLOB blob; enum ndr_err_code ndr_err; result = sptr_PrintServerData(server, mem_ctx, r->in.value_name, &data, r->out.type); if (!W_ERROR_IS_OK(result)) { return result; } ndr_err = ndr_push_union_blob(&blob, mem_ctx, &data, *r->out.type, (ndr_push_flags_fn_t)ndr_push_spoolss_PrinterData); if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { return WERR_GENERAL_FAILURE; } *r->out.needed = blob.length; if (r->in.offered >= *r->out.needed) { memcpy(r->out.data, blob.data, blob.length); } return WERR_OK; }
WERROR push_spoolss_PrinterData(TALLOC_CTX *mem_ctx, DATA_BLOB *blob, enum winreg_Type type, union spoolss_PrinterData *data) { enum ndr_err_code ndr_err; ndr_err = ndr_push_union_blob(blob, mem_ctx, NULL, data, type, (ndr_push_flags_fn_t)ndr_push_spoolss_PrinterData); if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { return WERR_GENERAL_FAILURE; } return WERR_OK; }
static NTSTATUS samba_get_logon_info_pac_blob(TALLOC_CTX *mem_ctx, struct auth_user_info_dc *info, DATA_BLOB *pac_data) { struct netr_SamInfo3 *info3; union PAC_INFO pac_info; enum ndr_err_code ndr_err; NTSTATUS nt_status; ZERO_STRUCT(pac_info); nt_status = auth_convert_user_info_dc_saminfo3(mem_ctx, info, &info3); if (!NT_STATUS_IS_OK(nt_status)) { DEBUG(1, ("Getting Samba info failed: %s\n", nt_errstr(nt_status))); return nt_status; } pac_info.logon_info.info = talloc_zero(mem_ctx, struct PAC_LOGON_INFO); if (!mem_ctx) { return NT_STATUS_NO_MEMORY; } pac_info.logon_info.info->info3 = *info3; ndr_err = ndr_push_union_blob(pac_data, mem_ctx, &pac_info, PAC_TYPE_LOGON_INFO, (ndr_push_flags_fn_t)ndr_push_PAC_INFO); if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { nt_status = ndr_map_error2ntstatus(ndr_err); DEBUG(1, ("PAC (presig) push failed: %s\n", nt_errstr(nt_status))); return nt_status; } return NT_STATUS_OK; }