2000-07-07 10:20:46 +04:00
/*
2002-08-17 20:05:44 +04:00
Unix SMB / CIFS implementation .
RPC pipe client
2005-07-20 19:35:29 +04:00
Copyright ( C ) Gerald Carter 2001 - 2005 ,
2002-08-17 20:05:44 +04:00
Copyright ( C ) Tim Potter 2000 - 2002 ,
Copyright ( C ) Andrew Tridgell 1994 - 2000 ,
Copyright ( C ) Jean - Francois Micouleau 1999 - 2000.
2005-09-30 21:13:37 +04:00
Copyright ( C ) Jeremy Allison 2005.
2002-08-17 20:05:44 +04:00
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
2007-07-09 23:25:36 +04:00
the Free Software Foundation ; either version 3 of the License , or
2002-08-17 20:05:44 +04:00
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
2007-07-10 04:52:41 +04:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2002-08-17 20:05:44 +04:00
*/
2000-07-07 10:20:46 +04:00
# include "includes.h"
2011-04-13 16:32:16 +04:00
# include "rpc_client/rpc_client.h"
2011-01-18 20:37:52 +03:00
# include "../librpc/gen_ndr/ndr_spoolss_c.h"
2010-05-18 20:26:48 +04:00
# include "rpc_client/cli_spoolss.h"
2014-09-23 10:19:46 +04:00
# include "auth/gensec/gensec.h"
# include "auth/credentials/credentials.h"
2000-07-14 21:01:49 +04:00
2009-02-09 19:56:20 +03:00
/**********************************************************************
convencience wrapper around rpccli_spoolss_OpenPrinterEx
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
WERROR rpccli_spoolss_openprinter_ex ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx ,
const char * printername ,
uint32_t access_desired ,
struct policy_handle * handle )
{
NTSTATUS status ;
WERROR werror ;
struct spoolss_DevmodeContainer devmode_ctr ;
2013-01-14 20:26:31 +04:00
struct spoolss_UserLevelCtr userlevel_ctr ;
2009-02-09 19:56:20 +03:00
struct spoolss_UserLevel1 level1 ;
2011-01-18 20:37:52 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2014-09-23 10:19:46 +04:00
struct cli_credentials * creds = gensec_get_credentials ( cli - > auth - > auth_ctx ) ;
2009-02-09 19:56:20 +03:00
ZERO_STRUCT ( devmode_ctr ) ;
level1 . size = 28 ;
2011-06-09 09:31:03 +04:00
level1 . client = talloc_asprintf ( mem_ctx , " \\ \\ %s " , lp_netbios_name ( ) ) ;
2009-02-21 23:07:37 +03:00
W_ERROR_HAVE_NO_MEMORY ( level1 . client ) ;
2014-09-23 10:19:46 +04:00
level1 . user = cli_credentials_get_username ( creds ) ;
2009-02-09 19:56:20 +03:00
level1 . build = 1381 ;
level1 . major = 2 ;
level1 . minor = 0 ;
level1 . processor = 0 ;
2013-01-14 20:26:31 +04:00
userlevel_ctr . level = 1 ;
userlevel_ctr . user_info . level1 = & level1 ;
2009-02-09 19:56:20 +03:00
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_OpenPrinterEx ( b , mem_ctx ,
2009-02-09 19:56:20 +03:00
printername ,
NULL ,
devmode_ctr ,
access_desired ,
2013-01-14 20:26:31 +04:00
userlevel_ctr ,
2009-02-09 19:56:20 +03:00
handle ,
& werror ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2011-01-18 20:37:52 +03:00
if ( ! W_ERROR_IS_OK ( werror ) ) {
return werror ;
}
2009-02-09 19:56:20 +03:00
return WERR_OK ;
}
2009-07-03 20:39:58 +04:00
/**********************************************************************
convencience wrapper around rpccli_spoolss_GetPrinterDriver
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
WERROR rpccli_spoolss_getprinterdriver ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx ,
struct policy_handle * handle ,
const char * architecture ,
uint32_t level ,
uint32_t offered ,
union spoolss_DriverInfo * info )
{
NTSTATUS status ;
WERROR werror ;
uint32_t needed ;
DATA_BLOB buffer ;
2011-01-18 20:37:52 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-07-03 20:39:58 +04:00
if ( offered > 0 ) {
buffer = data_blob_talloc_zero ( mem_ctx , offered ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
}
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_GetPrinterDriver ( b , mem_ctx ,
2009-07-03 20:39:58 +04:00
handle ,
architecture ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
info ,
& needed ,
& werror ) ;
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-07-03 20:39:58 +04:00
if ( W_ERROR_EQUAL ( werror , WERR_INSUFFICIENT_BUFFER ) ) {
offered = needed ;
buffer = data_blob_talloc_zero ( mem_ctx , needed ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_GetPrinterDriver ( b , mem_ctx ,
2009-07-03 20:39:58 +04:00
handle ,
architecture ,
level ,
& buffer ,
offered ,
info ,
& needed ,
& werror ) ;
}
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-07-03 20:39:58 +04:00
return werror ;
}
2009-02-25 00:18:22 +03:00
/**********************************************************************
convencience wrapper around rpccli_spoolss_GetPrinterDriver2
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
WERROR rpccli_spoolss_getprinterdriver2 ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx ,
struct policy_handle * handle ,
const char * architecture ,
uint32_t level ,
uint32_t offered ,
uint32_t client_major_version ,
uint32_t client_minor_version ,
union spoolss_DriverInfo * info ,
uint32_t * server_major_version ,
uint32_t * server_minor_version )
{
NTSTATUS status ;
WERROR werror ;
uint32_t needed ;
DATA_BLOB buffer ;
2011-01-18 20:37:52 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-02-25 00:18:22 +03:00
if ( offered > 0 ) {
buffer = data_blob_talloc_zero ( mem_ctx , offered ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
}
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_GetPrinterDriver2 ( b , mem_ctx ,
2009-02-25 00:18:22 +03:00
handle ,
architecture ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
client_major_version ,
client_minor_version ,
info ,
& needed ,
server_major_version ,
server_minor_version ,
& werror ) ;
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-02-25 00:18:22 +03:00
if ( W_ERROR_EQUAL ( werror , WERR_INSUFFICIENT_BUFFER ) ) {
offered = needed ;
buffer = data_blob_talloc_zero ( mem_ctx , needed ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_GetPrinterDriver2 ( b , mem_ctx ,
2009-02-25 00:18:22 +03:00
handle ,
architecture ,
level ,
& buffer ,
offered ,
client_major_version ,
client_minor_version ,
info ,
& needed ,
server_major_version ,
server_minor_version ,
& werror ) ;
}
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-02-25 00:18:22 +03:00
return werror ;
}
2009-02-25 03:07:50 +03:00
/**********************************************************************
convencience wrapper around rpccli_spoolss_AddPrinterEx
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
WERROR rpccli_spoolss_addprinterex ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx ,
struct spoolss_SetPrinterInfoCtr * info_ctr )
{
WERROR result ;
NTSTATUS status ;
struct spoolss_DevmodeContainer devmode_ctr ;
struct sec_desc_buf secdesc_ctr ;
struct spoolss_UserLevelCtr userlevel_ctr ;
struct spoolss_UserLevel1 level1 ;
struct policy_handle handle ;
2011-01-18 20:37:52 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2014-09-23 10:19:46 +04:00
struct cli_credentials * creds = gensec_get_credentials ( cli - > auth - > auth_ctx ) ;
2009-02-25 03:07:50 +03:00
ZERO_STRUCT ( devmode_ctr ) ;
ZERO_STRUCT ( secdesc_ctr ) ;
level1 . size = 28 ;
level1 . build = 1381 ;
level1 . major = 2 ;
level1 . minor = 0 ;
level1 . processor = 0 ;
2011-06-09 09:31:03 +04:00
level1 . client = talloc_asprintf ( mem_ctx , " \\ \\ %s " , lp_netbios_name ( ) ) ;
2009-02-25 03:07:50 +03:00
W_ERROR_HAVE_NO_MEMORY ( level1 . client ) ;
2014-09-23 10:19:46 +04:00
level1 . user = cli_credentials_get_username ( creds ) ;
2009-02-25 03:07:50 +03:00
userlevel_ctr . level = 1 ;
userlevel_ctr . user_info . level1 = & level1 ;
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_AddPrinterEx ( b , mem_ctx ,
2009-02-25 03:07:50 +03:00
cli - > srv_name_slash ,
info_ctr ,
& devmode_ctr ,
& secdesc_ctr ,
& userlevel_ctr ,
& handle ,
& result ) ;
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-02-25 03:07:50 +03:00
return result ;
}
2009-02-14 05:07:01 +03:00
/**********************************************************************
convencience wrapper around rpccli_spoolss_GetPrinter
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
WERROR rpccli_spoolss_getprinter ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx ,
struct policy_handle * handle ,
uint32_t level ,
uint32_t offered ,
union spoolss_PrinterInfo * info )
{
NTSTATUS status ;
WERROR werror ;
DATA_BLOB buffer ;
uint32_t needed ;
2011-01-18 20:37:52 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-02-14 05:07:01 +03:00
if ( offered > 0 ) {
buffer = data_blob_talloc_zero ( mem_ctx , offered ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
}
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_GetPrinter ( b , mem_ctx ,
2009-02-14 05:07:01 +03:00
handle ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
info ,
& needed ,
& werror ) ;
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-02-14 05:07:01 +03:00
if ( W_ERROR_EQUAL ( werror , WERR_INSUFFICIENT_BUFFER ) ) {
offered = needed ;
buffer = data_blob_talloc_zero ( mem_ctx , offered ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_GetPrinter ( b , mem_ctx ,
2009-02-14 05:07:01 +03:00
handle ,
level ,
& buffer ,
offered ,
info ,
& needed ,
& werror ) ;
}
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-02-14 05:07:01 +03:00
return werror ;
}
2009-02-26 17:33:57 +03:00
/**********************************************************************
convencience wrapper around rpccli_spoolss_GetJob
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
WERROR rpccli_spoolss_getjob ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx ,
struct policy_handle * handle ,
uint32_t job_id ,
uint32_t level ,
uint32_t offered ,
union spoolss_JobInfo * info )
{
NTSTATUS status ;
WERROR werror ;
uint32_t needed ;
DATA_BLOB buffer ;
2011-01-18 20:37:52 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-02-26 17:33:57 +03:00
if ( offered > 0 ) {
buffer = data_blob_talloc_zero ( mem_ctx , offered ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
}
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_GetJob ( b , mem_ctx ,
2009-02-26 17:33:57 +03:00
handle ,
job_id ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
info ,
& needed ,
& werror ) ;
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-02-26 17:33:57 +03:00
if ( W_ERROR_EQUAL ( werror , WERR_INSUFFICIENT_BUFFER ) ) {
offered = needed ;
buffer = data_blob_talloc_zero ( mem_ctx , needed ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_GetJob ( b , mem_ctx ,
2009-02-26 17:33:57 +03:00
handle ,
job_id ,
level ,
& buffer ,
offered ,
info ,
& needed ,
& werror ) ;
}
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-02-26 17:33:57 +03:00
return werror ;
}
2009-03-06 12:54:19 +03:00
/**********************************************************************
convencience wrapper around rpccli_spoolss_EnumForms
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
WERROR rpccli_spoolss_enumforms ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx ,
struct policy_handle * handle ,
uint32_t level ,
uint32_t offered ,
uint32_t * count ,
union spoolss_FormInfo * * info )
{
NTSTATUS status ;
WERROR werror ;
uint32_t needed ;
DATA_BLOB buffer ;
2011-01-18 20:37:52 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-03-06 12:54:19 +03:00
if ( offered > 0 ) {
buffer = data_blob_talloc_zero ( mem_ctx , offered ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
}
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_EnumForms ( b , mem_ctx ,
2009-03-06 12:54:19 +03:00
handle ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-03-06 12:54:19 +03:00
if ( W_ERROR_EQUAL ( werror , WERR_INSUFFICIENT_BUFFER ) ) {
offered = needed ;
buffer = data_blob_talloc_zero ( mem_ctx , needed ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_EnumForms ( b , mem_ctx ,
2009-03-06 12:54:19 +03:00
handle ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
}
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-03-06 12:54:19 +03:00
return werror ;
}
2009-03-07 00:09:47 +03:00
/**********************************************************************
convencience wrapper around rpccli_spoolss_EnumPrintProcessors
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
WERROR rpccli_spoolss_enumprintprocessors ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx ,
const char * servername ,
const char * environment ,
uint32_t level ,
uint32_t offered ,
uint32_t * count ,
union spoolss_PrintProcessorInfo * * info )
{
NTSTATUS status ;
WERROR werror ;
uint32_t needed ;
DATA_BLOB buffer ;
2011-01-18 20:37:52 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-03-07 00:09:47 +03:00
if ( offered > 0 ) {
buffer = data_blob_talloc_zero ( mem_ctx , offered ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
}
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_EnumPrintProcessors ( b , mem_ctx ,
2009-03-07 00:09:47 +03:00
servername ,
environment ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-03-07 00:09:47 +03:00
if ( W_ERROR_EQUAL ( werror , WERR_INSUFFICIENT_BUFFER ) ) {
offered = needed ;
buffer = data_blob_talloc_zero ( mem_ctx , needed ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_EnumPrintProcessors ( b , mem_ctx ,
2009-03-07 00:09:47 +03:00
servername ,
environment ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
}
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-03-07 00:09:47 +03:00
return werror ;
}
2009-02-26 17:33:57 +03:00
2009-03-07 00:22:49 +03:00
/**********************************************************************
2016-08-26 02:05:20 +03:00
convencience wrapper around rpccli_spoolss_EnumPrintProcessorDataTypes
2009-03-07 00:22:49 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
WERROR rpccli_spoolss_enumprintprocessordatatypes ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx ,
const char * servername ,
const char * print_processor_name ,
uint32_t level ,
uint32_t offered ,
uint32_t * count ,
union spoolss_PrintProcDataTypesInfo * * info )
{
NTSTATUS status ;
WERROR werror ;
uint32_t needed ;
DATA_BLOB buffer ;
2011-01-18 20:37:52 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-03-07 00:22:49 +03:00
if ( offered > 0 ) {
buffer = data_blob_talloc_zero ( mem_ctx , offered ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
}
2016-08-26 02:05:20 +03:00
status = dcerpc_spoolss_EnumPrintProcessorDataTypes ( b , mem_ctx ,
servername ,
print_processor_name ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-03-07 00:22:49 +03:00
if ( W_ERROR_EQUAL ( werror , WERR_INSUFFICIENT_BUFFER ) ) {
offered = needed ;
buffer = data_blob_talloc_zero ( mem_ctx , needed ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
2016-08-26 02:05:20 +03:00
status = dcerpc_spoolss_EnumPrintProcessorDataTypes ( b , mem_ctx ,
servername ,
print_processor_name ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
2009-03-07 00:22:49 +03:00
}
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-03-07 00:22:49 +03:00
return werror ;
}
2009-03-07 01:27:45 +03:00
/**********************************************************************
convencience wrapper around rpccli_spoolss_EnumPorts
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
WERROR rpccli_spoolss_enumports ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx ,
const char * servername ,
uint32_t level ,
uint32_t offered ,
uint32_t * count ,
union spoolss_PortInfo * * info )
{
NTSTATUS status ;
WERROR werror ;
uint32_t needed ;
DATA_BLOB buffer ;
2011-01-18 20:37:52 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-03-07 01:27:45 +03:00
if ( offered > 0 ) {
buffer = data_blob_talloc_zero ( mem_ctx , offered ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
}
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_EnumPorts ( b , mem_ctx ,
2009-03-07 01:27:45 +03:00
servername ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-03-07 01:27:45 +03:00
if ( W_ERROR_EQUAL ( werror , WERR_INSUFFICIENT_BUFFER ) ) {
offered = needed ;
buffer = data_blob_talloc_zero ( mem_ctx , needed ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_EnumPorts ( b , mem_ctx ,
2009-03-07 01:27:45 +03:00
servername ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
}
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-03-07 01:27:45 +03:00
return werror ;
}
2009-03-07 02:10:15 +03:00
/**********************************************************************
convencience wrapper around rpccli_spoolss_EnumMonitors
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
WERROR rpccli_spoolss_enummonitors ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx ,
const char * servername ,
uint32_t level ,
uint32_t offered ,
uint32_t * count ,
union spoolss_MonitorInfo * * info )
{
NTSTATUS status ;
WERROR werror ;
uint32_t needed ;
DATA_BLOB buffer ;
2011-01-18 20:37:52 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-03-07 02:10:15 +03:00
if ( offered > 0 ) {
buffer = data_blob_talloc_zero ( mem_ctx , offered ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
}
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_EnumMonitors ( b , mem_ctx ,
2009-03-07 02:10:15 +03:00
servername ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-03-07 02:10:15 +03:00
if ( W_ERROR_EQUAL ( werror , WERR_INSUFFICIENT_BUFFER ) ) {
offered = needed ;
buffer = data_blob_talloc_zero ( mem_ctx , needed ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_EnumMonitors ( b , mem_ctx ,
2009-03-07 02:10:15 +03:00
servername ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
}
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-03-07 02:10:15 +03:00
return werror ;
}
2009-03-08 00:22:42 +03:00
/**********************************************************************
convencience wrapper around rpccli_spoolss_EnumJobs
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
WERROR rpccli_spoolss_enumjobs ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx ,
struct policy_handle * handle ,
uint32_t firstjob ,
uint32_t numjobs ,
uint32_t level ,
uint32_t offered ,
uint32_t * count ,
union spoolss_JobInfo * * info )
{
NTSTATUS status ;
WERROR werror ;
uint32_t needed ;
DATA_BLOB buffer ;
2011-01-18 20:37:52 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-03-08 00:22:42 +03:00
if ( offered > 0 ) {
buffer = data_blob_talloc_zero ( mem_ctx , offered ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
}
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_EnumJobs ( b , mem_ctx ,
2009-03-08 00:22:42 +03:00
handle ,
firstjob ,
numjobs ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-03-08 00:22:42 +03:00
if ( W_ERROR_EQUAL ( werror , WERR_INSUFFICIENT_BUFFER ) ) {
offered = needed ;
buffer = data_blob_talloc_zero ( mem_ctx , needed ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_EnumJobs ( b , mem_ctx ,
2009-03-08 00:22:42 +03:00
handle ,
firstjob ,
numjobs ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
}
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-03-08 00:22:42 +03:00
return werror ;
}
2009-03-09 16:59:55 +03:00
/**********************************************************************
convencience wrapper around rpccli_spoolss_EnumPrinterDrivers
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
WERROR rpccli_spoolss_enumprinterdrivers ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx ,
const char * server ,
const char * environment ,
uint32_t level ,
uint32_t offered ,
uint32_t * count ,
union spoolss_DriverInfo * * info )
{
NTSTATUS status ;
WERROR werror ;
uint32_t needed ;
DATA_BLOB buffer ;
2011-01-18 20:37:52 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-03-09 16:59:55 +03:00
if ( offered > 0 ) {
buffer = data_blob_talloc_zero ( mem_ctx , offered ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
}
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_EnumPrinterDrivers ( b , mem_ctx ,
2009-03-09 16:59:55 +03:00
server ,
environment ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-03-09 16:59:55 +03:00
if ( W_ERROR_EQUAL ( werror , WERR_INSUFFICIENT_BUFFER ) ) {
offered = needed ;
buffer = data_blob_talloc_zero ( mem_ctx , needed ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_EnumPrinterDrivers ( b , mem_ctx ,
2009-03-09 16:59:55 +03:00
server ,
environment ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
}
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-03-09 16:59:55 +03:00
return werror ;
}
2009-03-10 00:00:47 +03:00
/**********************************************************************
convencience wrapper around rpccli_spoolss_EnumPrinters
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
WERROR rpccli_spoolss_enumprinters ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx ,
uint32_t flags ,
const char * server ,
uint32_t level ,
uint32_t offered ,
uint32_t * count ,
union spoolss_PrinterInfo * * info )
{
NTSTATUS status ;
WERROR werror ;
uint32_t needed ;
DATA_BLOB buffer ;
2011-01-18 20:37:52 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-03-10 00:00:47 +03:00
if ( offered > 0 ) {
buffer = data_blob_talloc_zero ( mem_ctx , offered ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
}
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_EnumPrinters ( b , mem_ctx ,
2009-03-10 00:00:47 +03:00
flags ,
server ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-03-10 00:00:47 +03:00
if ( W_ERROR_EQUAL ( werror , WERR_INSUFFICIENT_BUFFER ) ) {
offered = needed ;
buffer = data_blob_talloc_zero ( mem_ctx , needed ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_EnumPrinters ( b , mem_ctx ,
2009-03-10 00:00:47 +03:00
flags ,
server ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
}
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-03-10 00:00:47 +03:00
return werror ;
}
2009-03-08 00:22:42 +03:00
2009-03-14 03:26:27 +03:00
/**********************************************************************
convencience wrapper around rpccli_spoolss_GetPrinterData
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
WERROR rpccli_spoolss_getprinterdata ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx ,
struct policy_handle * handle ,
const char * value_name ,
uint32_t offered ,
enum winreg_Type * type ,
2010-03-04 17:46:28 +03:00
uint32_t * needed_p ,
uint8_t * * data_p )
2009-03-14 03:26:27 +03:00
{
NTSTATUS status ;
WERROR werror ;
uint32_t needed ;
2010-03-04 17:46:28 +03:00
uint8_t * data ;
2011-01-18 20:37:52 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2010-03-04 17:46:28 +03:00
data = talloc_zero_array ( mem_ctx , uint8_t , offered ) ;
W_ERROR_HAVE_NO_MEMORY ( data ) ;
2009-03-14 03:26:27 +03:00
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_GetPrinterData ( b , mem_ctx ,
2009-03-14 03:26:27 +03:00
handle ,
value_name ,
type ,
data ,
2010-03-04 17:46:28 +03:00
offered ,
2009-03-14 03:26:27 +03:00
& needed ,
& werror ) ;
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-03-14 03:26:27 +03:00
if ( W_ERROR_EQUAL ( werror , WERR_MORE_DATA ) ) {
offered = needed ;
2010-03-04 17:46:28 +03:00
data = talloc_zero_array ( mem_ctx , uint8_t , offered ) ;
W_ERROR_HAVE_NO_MEMORY ( data ) ;
2009-03-14 03:26:27 +03:00
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_GetPrinterData ( b , mem_ctx ,
2009-03-14 03:26:27 +03:00
handle ,
value_name ,
type ,
data ,
2010-03-04 17:46:28 +03:00
offered ,
2009-03-14 03:26:27 +03:00
& needed ,
& werror ) ;
}
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-03-14 03:26:27 +03:00
2010-03-04 17:46:28 +03:00
* data_p = data ;
* needed_p = needed ;
2009-03-14 03:26:27 +03:00
return werror ;
}
2009-03-16 23:41:11 +03:00
/**********************************************************************
convencience wrapper around rpccli_spoolss_EnumPrinterKey
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
WERROR rpccli_spoolss_enumprinterkey ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx ,
struct policy_handle * handle ,
const char * key_name ,
const char * * * key_buffer ,
uint32_t offered )
{
NTSTATUS status ;
WERROR werror ;
uint32_t needed ;
2009-12-10 16:20:22 +03:00
union spoolss_KeyNames _key_buffer ;
uint32_t _ndr_size ;
2011-01-18 20:37:52 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-03-16 23:41:11 +03:00
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_EnumPrinterKey ( b , mem_ctx ,
2009-03-16 23:41:11 +03:00
handle ,
key_name ,
2009-12-10 16:20:22 +03:00
& _ndr_size ,
2009-12-02 16:25:31 +03:00
& _key_buffer ,
2009-03-16 23:41:11 +03:00
offered ,
& needed ,
& werror ) ;
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-03-16 23:41:11 +03:00
if ( W_ERROR_EQUAL ( werror , WERR_MORE_DATA ) ) {
offered = needed ;
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_EnumPrinterKey ( b , mem_ctx ,
2009-03-16 23:41:11 +03:00
handle ,
key_name ,
2009-12-10 16:20:22 +03:00
& _ndr_size ,
2009-12-02 16:25:31 +03:00
& _key_buffer ,
2009-03-16 23:41:11 +03:00
offered ,
& needed ,
& werror ) ;
}
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-03-16 23:41:11 +03:00
2009-12-10 16:20:22 +03:00
* key_buffer = _key_buffer . string_array ;
2009-11-20 18:34:00 +03:00
2009-03-16 23:41:11 +03:00
return werror ;
}
2009-03-18 01:39:00 +03:00
/**********************************************************************
convencience wrapper around rpccli_spoolss_EnumPrinterDataEx
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
WERROR rpccli_spoolss_enumprinterdataex ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx ,
struct policy_handle * handle ,
const char * key_name ,
uint32_t offered ,
uint32_t * count ,
struct spoolss_PrinterEnumValues * * info )
{
NTSTATUS status ;
WERROR werror ;
uint32_t needed ;
2011-01-18 20:37:52 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-03-18 01:39:00 +03:00
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_EnumPrinterDataEx ( b , mem_ctx ,
2009-03-18 01:39:00 +03:00
handle ,
key_name ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-03-18 01:39:00 +03:00
if ( W_ERROR_EQUAL ( werror , WERR_MORE_DATA ) ) {
offered = needed ;
2011-01-18 20:37:52 +03:00
status = dcerpc_spoolss_EnumPrinterDataEx ( b , mem_ctx ,
2009-03-18 01:39:00 +03:00
handle ,
key_name ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
}
2011-01-18 20:37:52 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-03-18 01:39:00 +03:00
return werror ;
}