From: Andreas Schneider Date: Tue, 4 May 2010 09:43:27 +0000 (+0200) Subject: s3-spoolss: Added a winreg_printer_query_binary function. X-Git-Tag: samba-3.6.0pre1~2219 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=740418a150ff0ccccf47b4a40783c35f81723a89;p=thirdparty%2Fsamba.git s3-spoolss: Added a winreg_printer_query_binary function. Signed-off-by: Günther Deschner --- diff --git a/source3/rpc_server/srv_spoolss_util.c b/source3/rpc_server/srv_spoolss_util.c index 995cb7becc9..786aef176a5 100644 --- a/source3/rpc_server/srv_spoolss_util.c +++ b/source3/rpc_server/srv_spoolss_util.c @@ -1010,6 +1010,77 @@ static WERROR winreg_printer_write_binary(TALLOC_CTX *mem_ctx, return result; } +static WERROR winreg_printer_query_binary(TALLOC_CTX *mem_ctx, + struct rpc_pipe_client *pipe_handle, + struct policy_handle *key_handle, + const char *value, + DATA_BLOB *data) +{ + struct winreg_String wvalue; + enum winreg_Type type; + WERROR result = WERR_OK; + uint32_t value_len = 0; + NTSTATUS status; + DATA_BLOB blob; + + wvalue.name = value; + status = rpccli_winreg_QueryValue(pipe_handle, + mem_ctx, + key_handle, + &wvalue, + &type, + NULL, + (uint32_t *) &blob.length, + &value_len, + &result); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0, ("winreg_printer_query_dword: Could not query value %s: %s\n", + wvalue.name, nt_errstr(status))); + if (!W_ERROR_IS_OK(result)) { + goto done; + } + result = ntstatus_to_werror(status); + goto done; + } + + if (type != REG_BINARY) { + result = WERR_INVALID_DATATYPE; + goto done; + } + + blob.data = (uint8_t *) TALLOC(mem_ctx, blob.length); + if (blob.data == NULL) { + result = WERR_NOMEM; + goto done; + } + value_len = 0; + + status = rpccli_winreg_QueryValue(pipe_handle, + mem_ctx, + key_handle, + &wvalue, + &type, + blob.data, + (uint32_t *) &blob.length, + &value_len, + &result); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0, ("winreg_printer_query_dword: Could not query value %s: %s\n", + wvalue.name, nt_errstr(status))); + if (!W_ERROR_IS_OK(result)) { + result = ntstatus_to_werror(status); + } + goto done; + } + + if (data) { + data->data = blob.data; + data->length = blob.length; + } +done: + return result; +} + static WERROR winreg_printer_query_dword(TALLOC_CTX *mem_ctx, struct rpc_pipe_client *pipe_handle, struct policy_handle *key_handle,