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"
2005-07-20 19:35:29 +04:00
# include "rpc_client.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 ;
union spoolss_UserLevel userlevel ;
struct spoolss_UserLevel1 level1 ;
ZERO_STRUCT ( devmode_ctr ) ;
level1 . size = 28 ;
2009-02-21 23:07:37 +03:00
level1 . client = talloc_asprintf ( mem_ctx , " \\ \\ %s " , global_myname ( ) ) ;
W_ERROR_HAVE_NO_MEMORY ( level1 . client ) ;
2009-02-09 19:56:20 +03:00
level1 . user = cli - > auth - > user_name ;
level1 . build = 1381 ;
level1 . major = 2 ;
level1 . minor = 0 ;
level1 . processor = 0 ;
userlevel . level1 = & level1 ;
status = rpccli_spoolss_OpenPrinterEx ( cli , mem_ctx ,
printername ,
NULL ,
devmode_ctr ,
access_desired ,
1 , /* level */
userlevel ,
handle ,
& werror ) ;
if ( ! W_ERROR_IS_OK ( werror ) ) {
return werror ;
}
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
return WERR_OK ;
}
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 ;
if ( offered > 0 ) {
buffer = data_blob_talloc_zero ( mem_ctx , offered ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
}
status = rpccli_spoolss_GetPrinterDriver2 ( cli , mem_ctx ,
handle ,
architecture ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
client_major_version ,
client_minor_version ,
info ,
& needed ,
server_major_version ,
server_minor_version ,
& werror ) ;
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 ) ;
status = rpccli_spoolss_GetPrinterDriver2 ( cli , mem_ctx ,
handle ,
architecture ,
level ,
& buffer ,
offered ,
client_major_version ,
client_minor_version ,
info ,
& needed ,
server_major_version ,
server_minor_version ,
& werror ) ;
}
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 ;
ZERO_STRUCT ( devmode_ctr ) ;
ZERO_STRUCT ( secdesc_ctr ) ;
level1 . size = 28 ;
level1 . build = 1381 ;
level1 . major = 2 ;
level1 . minor = 0 ;
level1 . processor = 0 ;
level1 . client = talloc_asprintf ( mem_ctx , " \\ \\ %s " , global_myname ( ) ) ;
W_ERROR_HAVE_NO_MEMORY ( level1 . client ) ;
level1 . user = cli - > auth - > user_name ;
userlevel_ctr . level = 1 ;
userlevel_ctr . user_info . level1 = & level1 ;
status = rpccli_spoolss_AddPrinterEx ( cli , mem_ctx ,
cli - > srv_name_slash ,
info_ctr ,
& devmode_ctr ,
& secdesc_ctr ,
& userlevel_ctr ,
& handle ,
& result ) ;
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 ;
if ( offered > 0 ) {
buffer = data_blob_talloc_zero ( mem_ctx , offered ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
}
status = rpccli_spoolss_GetPrinter ( cli , mem_ctx ,
handle ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
info ,
& needed ,
& werror ) ;
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 ) ;
status = rpccli_spoolss_GetPrinter ( cli , mem_ctx ,
handle ,
level ,
& buffer ,
offered ,
info ,
& needed ,
& werror ) ;
}
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 ;
if ( offered > 0 ) {
buffer = data_blob_talloc_zero ( mem_ctx , offered ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
}
status = rpccli_spoolss_GetJob ( cli , mem_ctx ,
handle ,
job_id ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
info ,
& needed ,
& werror ) ;
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 ) ;
status = rpccli_spoolss_GetJob ( cli , mem_ctx ,
handle ,
job_id ,
level ,
& buffer ,
offered ,
info ,
& needed ,
& werror ) ;
}
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 ;
if ( offered > 0 ) {
buffer = data_blob_talloc_zero ( mem_ctx , offered ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
}
status = rpccli_spoolss_EnumForms ( cli , mem_ctx ,
handle ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
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 ) ;
status = rpccli_spoolss_EnumForms ( cli , mem_ctx ,
handle ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
}
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 ;
if ( offered > 0 ) {
buffer = data_blob_talloc_zero ( mem_ctx , offered ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
}
status = rpccli_spoolss_EnumPrintProcessors ( cli , mem_ctx ,
servername ,
environment ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
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 ) ;
status = rpccli_spoolss_EnumPrintProcessors ( cli , mem_ctx ,
servername ,
environment ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
}
return werror ;
}
2009-02-26 17:33:57 +03:00
2009-03-07 00:22:49 +03:00
/**********************************************************************
convencience wrapper around rpccli_spoolss_EnumPrintProcDataTypes
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
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 ;
if ( offered > 0 ) {
buffer = data_blob_talloc_zero ( mem_ctx , offered ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
}
status = rpccli_spoolss_EnumPrintProcDataTypes ( cli , mem_ctx ,
servername ,
print_processor_name ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
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 ) ;
status = rpccli_spoolss_EnumPrintProcDataTypes ( cli , mem_ctx ,
servername ,
print_processor_name ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
}
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 ;
if ( offered > 0 ) {
buffer = data_blob_talloc_zero ( mem_ctx , offered ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
}
status = rpccli_spoolss_EnumPorts ( cli , mem_ctx ,
servername ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
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 ) ;
status = rpccli_spoolss_EnumPorts ( cli , mem_ctx ,
servername ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
}
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 ;
if ( offered > 0 ) {
buffer = data_blob_talloc_zero ( mem_ctx , offered ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
}
status = rpccli_spoolss_EnumMonitors ( cli , mem_ctx ,
servername ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
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 ) ;
status = rpccli_spoolss_EnumMonitors ( cli , mem_ctx ,
servername ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
}
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 ;
if ( offered > 0 ) {
buffer = data_blob_talloc_zero ( mem_ctx , offered ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
}
status = rpccli_spoolss_EnumJobs ( cli , mem_ctx ,
handle ,
firstjob ,
numjobs ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
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 ) ;
status = rpccli_spoolss_EnumJobs ( cli , mem_ctx ,
handle ,
firstjob ,
numjobs ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
}
return werror ;
}
2002-08-17 20:05:44 +04:00
/*********************************************************************
Decode various spoolss rpc ' s and info levels
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/**********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-07-20 19:35:29 +04:00
2007-10-19 04:40:25 +04:00
static bool decode_printer_info_0 ( TALLOC_CTX * mem_ctx , RPC_BUFFER * buffer ,
2002-08-17 20:05:44 +04:00
uint32 returned , PRINTER_INFO_0 * * info )
2000-07-07 10:20:46 +04:00
{
2005-11-01 22:24:55 +03:00
uint32 i ;
PRINTER_INFO_0 * inf ;
2000-07-07 10:20:46 +04:00
2007-04-30 06:39:34 +04:00
if ( returned ) {
inf = TALLOC_ARRAY ( mem_ctx , PRINTER_INFO_0 , returned ) ;
if ( ! inf ) {
return False ;
}
memset ( inf , 0 , returned * sizeof ( PRINTER_INFO_0 ) ) ;
} else {
inf = NULL ;
2005-11-01 22:24:55 +03:00
}
2000-07-07 10:20:46 +04:00
2003-02-15 01:55:46 +03:00
prs_set_offset ( & buffer - > prs , 0 ) ;
2000-07-07 10:20:46 +04:00
2005-11-01 22:24:55 +03:00
for ( i = 0 ; i < returned ; i + + ) {
if ( ! smb_io_printer_info_0 ( " " , buffer , & inf [ i ] , 0 ) ) {
return False ;
}
}
2000-07-07 10:20:46 +04:00
2005-11-01 22:24:55 +03:00
* info = inf ;
return True ;
2002-08-17 20:05:44 +04:00
}
2000-07-07 10:20:46 +04:00
2002-08-17 20:05:44 +04:00
/**********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-11-01 22:24:55 +03:00
2007-10-19 04:40:25 +04:00
static bool decode_printer_info_1 ( TALLOC_CTX * mem_ctx , RPC_BUFFER * buffer ,
2002-08-17 20:05:44 +04:00
uint32 returned , PRINTER_INFO_1 * * info )
{
2005-11-01 22:24:55 +03:00
uint32 i ;
PRINTER_INFO_1 * inf ;
2000-07-07 10:20:46 +04:00
2007-04-30 06:39:34 +04:00
if ( returned ) {
inf = TALLOC_ARRAY ( mem_ctx , PRINTER_INFO_1 , returned ) ;
if ( ! inf ) {
return False ;
}
memset ( inf , 0 , returned * sizeof ( PRINTER_INFO_1 ) ) ;
} else {
inf = NULL ;
2005-11-01 22:24:55 +03:00
}
2000-07-07 10:20:46 +04:00
2003-02-15 01:55:46 +03:00
prs_set_offset ( & buffer - > prs , 0 ) ;
2000-07-07 10:20:46 +04:00
2005-11-01 22:24:55 +03:00
for ( i = 0 ; i < returned ; i + + ) {
if ( ! smb_io_printer_info_1 ( " " , buffer , & inf [ i ] , 0 ) ) {
return False ;
}
}
2000-07-07 10:20:46 +04:00
2005-11-01 22:24:55 +03:00
* info = inf ;
return True ;
2002-08-17 20:05:44 +04:00
}
2000-07-07 10:20:46 +04:00
2002-08-17 20:05:44 +04:00
/**********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-11-01 22:24:55 +03:00
2007-10-19 04:40:25 +04:00
static bool decode_printer_info_2 ( TALLOC_CTX * mem_ctx , RPC_BUFFER * buffer ,
2002-08-17 20:05:44 +04:00
uint32 returned , PRINTER_INFO_2 * * info )
{
2005-11-01 22:24:55 +03:00
uint32 i ;
PRINTER_INFO_2 * inf ;
2000-07-07 10:20:46 +04:00
2007-04-30 06:39:34 +04:00
if ( returned ) {
inf = TALLOC_ARRAY ( mem_ctx , PRINTER_INFO_2 , returned ) ;
if ( ! inf ) {
return False ;
}
memset ( inf , 0 , returned * sizeof ( PRINTER_INFO_2 ) ) ;
} else {
inf = NULL ;
2005-11-01 22:24:55 +03:00
}
2000-07-07 10:20:46 +04:00
2003-02-15 01:55:46 +03:00
prs_set_offset ( & buffer - > prs , 0 ) ;
2000-07-14 21:01:49 +04:00
2005-11-01 22:24:55 +03:00
for ( i = 0 ; i < returned ; i + + ) {
2002-08-17 20:05:44 +04:00
/* a little initialization as we go */
inf [ i ] . secdesc = NULL ;
2005-11-01 22:24:55 +03:00
if ( ! smb_io_printer_info_2 ( " " , buffer , & inf [ i ] , 0 ) ) {
return False ;
}
}
2000-07-14 21:01:49 +04:00
2005-11-01 22:24:55 +03:00
* info = inf ;
return True ;
2000-07-14 21:01:49 +04:00
}
2002-08-17 20:05:44 +04:00
/**********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-11-01 22:24:55 +03:00
2007-10-19 04:40:25 +04:00
static bool decode_printer_info_3 ( TALLOC_CTX * mem_ctx , RPC_BUFFER * buffer ,
2002-08-17 20:05:44 +04:00
uint32 returned , PRINTER_INFO_3 * * info )
2000-07-22 00:03:18 +04:00
{
2005-11-01 22:24:55 +03:00
uint32 i ;
PRINTER_INFO_3 * inf ;
2002-08-17 20:05:44 +04:00
2007-04-30 06:39:34 +04:00
if ( returned ) {
inf = TALLOC_ARRAY ( mem_ctx , PRINTER_INFO_3 , returned ) ;
if ( ! inf ) {
return False ;
}
memset ( inf , 0 , returned * sizeof ( PRINTER_INFO_3 ) ) ;
} else {
inf = NULL ;
2005-11-01 22:24:55 +03:00
}
2002-08-17 20:05:44 +04:00
2003-02-15 01:55:46 +03:00
prs_set_offset ( & buffer - > prs , 0 ) ;
2000-07-22 00:03:18 +04:00
2005-11-01 22:24:55 +03:00
for ( i = 0 ; i < returned ; i + + ) {
2002-08-17 20:05:44 +04:00
inf [ i ] . secdesc = NULL ;
2005-11-01 22:24:55 +03:00
if ( ! smb_io_printer_info_3 ( " " , buffer , & inf [ i ] , 0 ) ) {
return False ;
}
}
2002-08-17 20:05:44 +04:00
2005-11-01 22:24:55 +03:00
* info = inf ;
return True ;
2002-08-17 20:05:44 +04:00
}
2000-07-22 00:03:18 +04:00
2002-08-17 20:05:44 +04:00
/**********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-11-01 22:24:55 +03:00
2007-10-19 04:40:25 +04:00
static bool decode_printer_driver_1 ( TALLOC_CTX * mem_ctx , RPC_BUFFER * buffer ,
2002-08-17 20:05:44 +04:00
uint32 returned , DRIVER_INFO_1 * * info )
{
2005-11-01 22:24:55 +03:00
uint32 i ;
DRIVER_INFO_1 * inf ;
2002-08-17 20:05:44 +04:00
2007-04-30 06:39:34 +04:00
if ( returned ) {
inf = TALLOC_ARRAY ( mem_ctx , DRIVER_INFO_1 , returned ) ;
if ( ! inf ) {
return False ;
}
memset ( inf , 0 , returned * sizeof ( DRIVER_INFO_1 ) ) ;
} else {
inf = NULL ;
2005-11-01 22:24:55 +03:00
}
2002-08-17 20:05:44 +04:00
2003-02-15 01:55:46 +03:00
prs_set_offset ( & buffer - > prs , 0 ) ;
2000-07-22 00:03:18 +04:00
2005-11-01 22:24:55 +03:00
for ( i = 0 ; i < returned ; i + + ) {
if ( ! smb_io_printer_driver_info_1 ( " " , buffer , & ( inf [ i ] ) , 0 ) ) {
return False ;
}
}
2000-07-22 00:03:18 +04:00
2005-11-01 22:24:55 +03:00
* info = inf ;
return True ;
2000-07-22 00:03:18 +04:00
}
2002-08-17 20:05:44 +04:00
/**********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-11-01 22:24:55 +03:00
2007-10-19 04:40:25 +04:00
static bool decode_printer_driver_2 ( TALLOC_CTX * mem_ctx , RPC_BUFFER * buffer ,
2002-08-17 20:05:44 +04:00
uint32 returned , DRIVER_INFO_2 * * info )
2000-07-14 21:01:49 +04:00
{
2005-11-01 22:24:55 +03:00
uint32 i ;
DRIVER_INFO_2 * inf ;
2002-08-17 20:05:44 +04:00
2007-04-30 06:39:34 +04:00
if ( returned ) {
inf = TALLOC_ARRAY ( mem_ctx , DRIVER_INFO_2 , returned ) ;
if ( ! inf ) {
return False ;
}
memset ( inf , 0 , returned * sizeof ( DRIVER_INFO_2 ) ) ;
} else {
inf = NULL ;
2005-11-01 22:24:55 +03:00
}
2000-07-14 21:01:49 +04:00
2003-02-15 01:55:46 +03:00
prs_set_offset ( & buffer - > prs , 0 ) ;
2000-07-14 21:01:49 +04:00
2005-11-01 22:24:55 +03:00
for ( i = 0 ; i < returned ; i + + ) {
if ( ! smb_io_printer_driver_info_2 ( " " , buffer , & ( inf [ i ] ) , 0 ) ) {
return False ;
}
}
2002-08-17 20:05:44 +04:00
2005-11-01 22:24:55 +03:00
* info = inf ;
return True ;
2002-08-17 20:05:44 +04:00
}
2000-07-14 21:01:49 +04:00
2002-08-17 20:05:44 +04:00
/**********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-11-01 22:24:55 +03:00
2007-10-19 04:40:25 +04:00
static bool decode_printer_driver_3 ( TALLOC_CTX * mem_ctx , RPC_BUFFER * buffer ,
2002-08-17 20:05:44 +04:00
uint32 returned , DRIVER_INFO_3 * * info )
{
2005-11-01 22:24:55 +03:00
uint32 i ;
DRIVER_INFO_3 * inf ;
2000-07-14 21:01:49 +04:00
2007-04-30 06:39:34 +04:00
if ( returned ) {
inf = TALLOC_ARRAY ( mem_ctx , DRIVER_INFO_3 , returned ) ;
if ( ! inf ) {
return False ;
}
memset ( inf , 0 , returned * sizeof ( DRIVER_INFO_3 ) ) ;
} else {
inf = NULL ;
2005-11-01 22:24:55 +03:00
}
2000-07-14 21:01:49 +04:00
2003-02-15 01:55:46 +03:00
prs_set_offset ( & buffer - > prs , 0 ) ;
2000-07-14 21:01:49 +04:00
2005-11-01 22:24:55 +03:00
for ( i = 0 ; i < returned ; i + + ) {
if ( ! smb_io_printer_driver_info_3 ( " " , buffer , & ( inf [ i ] ) , 0 ) ) {
return False ;
}
}
2000-07-14 21:01:49 +04:00
2005-11-01 22:24:55 +03:00
* info = inf ;
return True ;
2002-08-17 20:05:44 +04:00
}
2000-07-14 21:01:49 +04:00
2002-08-17 20:05:44 +04:00
/**********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-11-01 22:24:55 +03:00
2005-09-30 21:13:37 +04:00
WERROR rpccli_spoolss_enum_printers ( struct rpc_pipe_client * cli , TALLOC_CTX * mem_ctx ,
2002-09-25 19:19:00 +04:00
char * name , uint32 flags , uint32 level ,
2002-08-17 20:05:44 +04:00
uint32 * num_printers , PRINTER_INFO_CTR * ctr )
2000-07-14 21:01:49 +04:00
{
2002-08-17 20:05:44 +04:00
prs_struct qbuf , rbuf ;
2005-07-20 19:35:29 +04:00
SPOOL_Q_ENUMPRINTERS in ;
SPOOL_R_ENUMPRINTERS out ;
2005-03-15 22:43:44 +03:00
RPC_BUFFER buffer ;
2005-07-20 19:35:29 +04:00
uint32 offered ;
2002-08-17 20:05:44 +04:00
2005-07-20 19:35:29 +04:00
ZERO_STRUCT ( in ) ;
ZERO_STRUCT ( out ) ;
2002-08-17 20:05:44 +04:00
2005-07-20 19:35:29 +04:00
offered = 0 ;
2009-01-20 02:09:51 +03:00
if ( ! rpcbuf_init ( & buffer , offered , mem_ctx ) )
return WERR_NOMEM ;
2005-07-20 19:35:29 +04:00
make_spoolss_q_enumprinters ( & in , flags , name , level , & buffer , offered ) ;
2008-07-21 14:50:32 +04:00
CLI_DO_RPC_WERR ( cli , mem_ctx , & syntax_spoolss , SPOOLSS_ENUMPRINTERS ,
2005-07-20 19:35:29 +04:00
in , out ,
qbuf , rbuf ,
spoolss_io_q_enumprinters ,
spoolss_io_r_enumprinters ,
WERR_GENERAL_FAILURE ) ;
if ( W_ERROR_EQUAL ( out . status , WERR_INSUFFICIENT_BUFFER ) ) {
offered = out . needed ;
ZERO_STRUCT ( in ) ;
ZERO_STRUCT ( out ) ;
2009-01-20 02:09:51 +03:00
if ( ! rpcbuf_init ( & buffer , offered , mem_ctx ) )
return WERR_NOMEM ;
2005-07-20 19:35:29 +04:00
make_spoolss_q_enumprinters ( & in , flags , name , level , & buffer , offered ) ;
2008-07-21 14:50:32 +04:00
CLI_DO_RPC_WERR ( cli , mem_ctx , & syntax_spoolss , SPOOLSS_ENUMPRINTERS ,
2005-07-20 19:35:29 +04:00
in , out ,
qbuf , rbuf ,
spoolss_io_q_enumprinters ,
spoolss_io_r_enumprinters ,
WERR_GENERAL_FAILURE ) ;
2002-08-17 20:05:44 +04:00
}
2005-07-20 19:35:29 +04:00
if ( ! W_ERROR_IS_OK ( out . status ) )
return out . status ;
2002-08-17 20:05:44 +04:00
switch ( level ) {
case 0 :
2005-11-01 22:24:55 +03:00
if ( ! decode_printer_info_0 ( mem_ctx , out . buffer , out . returned , & ctr - > printers_0 ) ) {
return WERR_GENERAL_FAILURE ;
}
2002-08-17 20:05:44 +04:00
break ;
case 1 :
2005-11-01 22:24:55 +03:00
if ( ! decode_printer_info_1 ( mem_ctx , out . buffer , out . returned , & ctr - > printers_1 ) ) {
return WERR_GENERAL_FAILURE ;
}
2002-08-17 20:05:44 +04:00
break ;
case 2 :
2005-11-01 22:24:55 +03:00
if ( ! decode_printer_info_2 ( mem_ctx , out . buffer , out . returned , & ctr - > printers_2 ) ) {
return WERR_GENERAL_FAILURE ;
}
2002-08-17 20:05:44 +04:00
break ;
case 3 :
2005-11-01 22:24:55 +03:00
if ( ! decode_printer_info_3 ( mem_ctx , out . buffer , out . returned , & ctr - > printers_3 ) ) {
2005-12-06 23:22:51 +03:00
return WERR_GENERAL_FAILURE ;
2005-11-01 22:24:55 +03:00
}
2002-08-17 20:05:44 +04:00
break ;
2005-11-01 22:24:55 +03:00
default :
return WERR_UNKNOWN_LEVEL ;
2002-08-17 20:05:44 +04:00
}
2005-11-01 22:24:55 +03:00
2005-07-20 19:35:29 +04:00
* num_printers = out . returned ;
2000-07-14 21:01:49 +04:00
2005-07-20 19:35:29 +04:00
return out . status ;
2002-08-17 20:05:44 +04:00
}
2000-07-14 21:01:49 +04:00
2005-07-20 19:35:29 +04:00
/**********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2000-07-14 21:01:49 +04:00
2005-09-30 21:13:37 +04:00
WERROR rpccli_spoolss_enumprinterdrivers ( struct rpc_pipe_client * cli ,
2002-08-17 20:05:44 +04:00
TALLOC_CTX * mem_ctx ,
2003-01-03 11:28:12 +03:00
uint32 level , const char * env ,
2002-08-17 20:05:44 +04:00
uint32 * num_drivers ,
PRINTER_DRIVER_CTR * ctr )
{
prs_struct qbuf , rbuf ;
2005-07-20 19:35:29 +04:00
SPOOL_Q_ENUMPRINTERDRIVERS in ;
SPOOL_R_ENUMPRINTERDRIVERS out ;
2005-03-15 22:43:44 +03:00
RPC_BUFFER buffer ;
2002-08-17 20:05:44 +04:00
fstring server ;
2005-07-20 19:35:29 +04:00
uint32 offered ;
2002-08-17 20:05:44 +04:00
2005-07-20 19:35:29 +04:00
ZERO_STRUCT ( in ) ;
ZERO_STRUCT ( out ) ;
2002-08-17 20:05:44 +04:00
2008-04-19 23:56:43 +04:00
slprintf ( server , sizeof ( fstring ) - 1 , " \\ \\ %s " , cli - > desthost ) ;
2003-07-03 23:11:31 +04:00
strupper_m ( server ) ;
2002-08-17 20:05:44 +04:00
2005-07-20 19:35:29 +04:00
offered = 0 ;
2009-01-20 02:09:51 +03:00
if ( ! rpcbuf_init ( & buffer , offered , mem_ctx ) )
return WERR_NOMEM ;
2005-07-20 19:35:29 +04:00
make_spoolss_q_enumprinterdrivers ( & in , server , env , level ,
& buffer , offered ) ;
2000-08-04 16:46:36 +04:00
2008-07-21 14:50:32 +04:00
CLI_DO_RPC_WERR ( cli , mem_ctx , & syntax_spoolss , SPOOLSS_ENUMPRINTERDRIVERS ,
2005-07-20 19:35:29 +04:00
in , out ,
qbuf , rbuf ,
spoolss_io_q_enumprinterdrivers ,
spoolss_io_r_enumprinterdrivers ,
WERR_GENERAL_FAILURE ) ;
if ( W_ERROR_EQUAL ( out . status , WERR_INSUFFICIENT_BUFFER ) ) {
offered = out . needed ;
ZERO_STRUCT ( in ) ;
ZERO_STRUCT ( out ) ;
2009-01-20 02:09:51 +03:00
if ( ! rpcbuf_init ( & buffer , offered , mem_ctx ) )
return WERR_NOMEM ;
2005-07-20 19:35:29 +04:00
make_spoolss_q_enumprinterdrivers ( & in , server , env , level ,
& buffer , offered ) ;
2000-08-04 16:46:36 +04:00
2008-07-21 14:50:32 +04:00
CLI_DO_RPC_WERR ( cli , mem_ctx , & syntax_spoolss , SPOOLSS_ENUMPRINTERDRIVERS ,
2005-07-20 19:35:29 +04:00
in , out ,
qbuf , rbuf ,
spoolss_io_q_enumprinterdrivers ,
spoolss_io_r_enumprinterdrivers ,
WERR_GENERAL_FAILURE ) ;
}
* num_drivers = out . returned ;
2002-08-17 20:05:44 +04:00
2005-07-20 19:35:29 +04:00
if ( ! W_ERROR_IS_OK ( out . status ) )
return out . status ;
if ( out . returned ) {
2002-08-17 20:05:44 +04:00
switch ( level ) {
case 1 :
2005-11-01 22:24:55 +03:00
if ( ! decode_printer_driver_1 ( mem_ctx , out . buffer , out . returned , & ctr - > info1 ) ) {
return WERR_GENERAL_FAILURE ;
}
2002-08-17 20:05:44 +04:00
break ;
case 2 :
2005-11-01 22:24:55 +03:00
if ( ! decode_printer_driver_2 ( mem_ctx , out . buffer , out . returned , & ctr - > info2 ) ) {
return WERR_GENERAL_FAILURE ;
}
2002-08-17 20:05:44 +04:00
break ;
case 3 :
2005-11-01 22:24:55 +03:00
if ( ! decode_printer_driver_3 ( mem_ctx , out . buffer , out . returned , & ctr - > info3 ) ) {
return WERR_GENERAL_FAILURE ;
}
2002-08-17 20:05:44 +04:00
break ;
2005-11-01 22:24:55 +03:00
default :
return WERR_UNKNOWN_LEVEL ;
2000-08-05 00:32:34 +04:00
}
2002-08-17 20:05:44 +04:00
}
2005-07-20 19:35:29 +04:00
return out . status ;
2002-08-17 20:05:44 +04:00
}
/**********************************************************************
2005-07-20 19:35:29 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-09-30 21:13:37 +04:00
WERROR rpccli_spoolss_getprinterdata ( struct rpc_pipe_client * cli , TALLOC_CTX * mem_ctx ,
2003-02-26 02:51:56 +03:00
POLICY_HND * hnd , const char * valuename ,
2002-09-25 19:19:00 +04:00
REGISTRY_VALUE * value )
2002-08-17 20:05:44 +04:00
{
prs_struct qbuf , rbuf ;
2005-07-20 19:35:29 +04:00
SPOOL_Q_GETPRINTERDATA in ;
SPOOL_R_GETPRINTERDATA out ;
uint32 offered ;
2002-08-17 20:05:44 +04:00
2005-07-20 19:35:29 +04:00
ZERO_STRUCT ( in ) ;
ZERO_STRUCT ( out ) ;
2002-08-17 20:05:44 +04:00
2005-07-20 19:35:29 +04:00
offered = 0 ;
make_spoolss_q_getprinterdata ( & in , hnd , valuename , offered ) ;
2002-08-17 20:05:44 +04:00
2008-07-21 14:50:32 +04:00
CLI_DO_RPC_WERR ( cli , mem_ctx , & syntax_spoolss , SPOOLSS_GETPRINTERDATA ,
2005-07-20 19:35:29 +04:00
in , out ,
qbuf , rbuf ,
spoolss_io_q_getprinterdata ,
spoolss_io_r_getprinterdata ,
WERR_GENERAL_FAILURE ) ;
2002-08-17 20:05:44 +04:00
2005-07-20 19:35:29 +04:00
if ( W_ERROR_EQUAL ( out . status , WERR_MORE_DATA ) ) {
offered = out . needed ;
ZERO_STRUCT ( in ) ;
ZERO_STRUCT ( out ) ;
make_spoolss_q_getprinterdata ( & in , hnd , valuename , offered ) ;
2008-07-21 14:50:32 +04:00
CLI_DO_RPC_WERR ( cli , mem_ctx , & syntax_spoolss , SPOOLSS_GETPRINTERDATA ,
2005-07-20 19:35:29 +04:00
in , out ,
qbuf , rbuf ,
spoolss_io_q_getprinterdata ,
spoolss_io_r_getprinterdata ,
WERR_GENERAL_FAILURE ) ;
}
2002-08-17 20:05:44 +04:00
2005-07-20 19:35:29 +04:00
if ( ! W_ERROR_IS_OK ( out . status ) )
return out . status ;
2002-08-17 20:05:44 +04:00
/* Return output parameters */
2007-04-30 05:34:28 +04:00
if ( out . needed ) {
value - > data_p = ( uint8 * ) TALLOC_MEMDUP ( mem_ctx , out . data , out . needed ) ;
} else {
value - > data_p = NULL ;
}
2005-07-20 19:35:29 +04:00
value - > type = out . type ;
value - > size = out . size ;
2002-09-25 19:19:00 +04:00
2005-07-20 19:35:29 +04:00
return out . status ;
2002-08-17 20:05:44 +04:00
}
2005-07-20 19:35:29 +04:00
/**********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-08-17 20:05:44 +04:00
2005-09-30 21:13:37 +04:00
WERROR rpccli_spoolss_setprinterdata ( struct rpc_pipe_client * cli , TALLOC_CTX * mem_ctx ,
2002-09-25 19:19:00 +04:00
POLICY_HND * hnd , REGISTRY_VALUE * value )
2002-08-17 20:05:44 +04:00
{
prs_struct qbuf , rbuf ;
2005-07-20 19:35:29 +04:00
SPOOL_Q_SETPRINTERDATA in ;
SPOOL_R_SETPRINTERDATA out ;
ZERO_STRUCT ( in ) ;
ZERO_STRUCT ( out ) ;
make_spoolss_q_setprinterdata ( & in , hnd , value - > valuename ,
value - > type , ( char * ) value - > data_p , value - > size ) ;
2008-07-21 14:50:32 +04:00
CLI_DO_RPC_WERR ( cli , mem_ctx , & syntax_spoolss , SPOOLSS_SETPRINTERDATA ,
2005-07-20 19:35:29 +04:00
in , out ,
qbuf , rbuf ,
spoolss_io_q_setprinterdata ,
spoolss_io_r_setprinterdata ,
WERR_GENERAL_FAILURE ) ;
return out . status ;
2002-08-17 20:05:44 +04:00
}
2005-07-20 19:35:29 +04:00
/**********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-09-30 21:13:37 +04:00
WERROR rpccli_spoolss_enumprinterdata ( struct rpc_pipe_client * cli , TALLOC_CTX * mem_ctx ,
2002-08-17 20:05:44 +04:00
POLICY_HND * hnd , uint32 ndx ,
uint32 value_offered , uint32 data_offered ,
uint32 * value_needed , uint32 * data_needed ,
2002-09-25 19:19:00 +04:00
REGISTRY_VALUE * value )
2002-08-17 20:05:44 +04:00
{
prs_struct qbuf , rbuf ;
2005-07-20 19:35:29 +04:00
SPOOL_Q_ENUMPRINTERDATA in ;
SPOOL_R_ENUMPRINTERDATA out ;
ZERO_STRUCT ( in ) ;
ZERO_STRUCT ( out ) ;
make_spoolss_q_enumprinterdata ( & in , hnd , ndx , value_offered , data_offered ) ;
2008-07-21 14:50:32 +04:00
CLI_DO_RPC_WERR ( cli , mem_ctx , & syntax_spoolss , SPOOLSS_ENUMPRINTERDATA ,
2005-07-20 19:35:29 +04:00
in , out ,
qbuf , rbuf ,
spoolss_io_q_enumprinterdata ,
spoolss_io_r_enumprinterdata ,
WERR_GENERAL_FAILURE ) ;
2005-08-04 07:11:02 +04:00
if ( value_needed )
* value_needed = out . realvaluesize ;
2005-08-04 07:25:33 +04:00
if ( data_needed )
2005-08-04 07:11:02 +04:00
* data_needed = out . realdatasize ;
2005-07-20 19:35:29 +04:00
if ( ! W_ERROR_IS_OK ( out . status ) )
return out . status ;
2002-08-17 20:05:44 +04:00
if ( value ) {
2005-07-20 19:35:29 +04:00
rpcstr_pull ( value - > valuename , out . value , sizeof ( value - > valuename ) , - 1 ,
2002-08-17 20:05:44 +04:00
STR_TERMINATE ) ;
2007-04-30 05:34:28 +04:00
if ( out . realdatasize ) {
value - > data_p = ( uint8 * ) TALLOC_MEMDUP ( mem_ctx , out . data ,
2006-07-30 20:36:56 +04:00
out . realdatasize ) ;
2007-04-30 05:34:28 +04:00
} else {
value - > data_p = NULL ;
}
2005-07-20 19:35:29 +04:00
value - > type = out . type ;
value - > size = out . realdatasize ;
2002-08-17 20:05:44 +04:00
}
2005-07-20 19:35:29 +04:00
return out . status ;
2002-09-25 19:19:00 +04:00
}
2005-07-20 19:35:29 +04:00
/**********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-09-30 21:13:37 +04:00
WERROR rpccli_spoolss_enumprinterdataex ( struct rpc_pipe_client * cli , TALLOC_CTX * mem_ctx ,
2003-01-03 11:28:12 +03:00
POLICY_HND * hnd , const char * keyname ,
2002-09-25 19:19:00 +04:00
REGVAL_CTR * ctr )
{
prs_struct qbuf , rbuf ;
2005-07-20 19:35:29 +04:00
SPOOL_Q_ENUMPRINTERDATAEX in ;
SPOOL_R_ENUMPRINTERDATAEX out ;
2002-09-25 19:19:00 +04:00
int i ;
2005-07-20 19:35:29 +04:00
uint32 offered ;
2002-09-25 19:19:00 +04:00
2005-07-20 19:35:29 +04:00
ZERO_STRUCT ( in ) ;
ZERO_STRUCT ( out ) ;
2002-09-25 19:19:00 +04:00
2005-07-20 19:35:29 +04:00
offered = 0 ;
make_spoolss_q_enumprinterdataex ( & in , hnd , keyname , offered ) ;
2002-08-17 20:05:44 +04:00
2008-07-21 14:50:32 +04:00
CLI_DO_RPC_WERR ( cli , mem_ctx , & syntax_spoolss , SPOOLSS_ENUMPRINTERDATAEX ,
2005-07-20 19:35:29 +04:00
in , out ,
qbuf , rbuf ,
spoolss_io_q_enumprinterdataex ,
spoolss_io_r_enumprinterdataex ,
WERR_GENERAL_FAILURE ) ;
2002-09-25 19:19:00 +04:00
2005-07-20 19:35:29 +04:00
if ( W_ERROR_EQUAL ( out . status , WERR_MORE_DATA ) ) {
offered = out . needed ;
ZERO_STRUCT ( in ) ;
ZERO_STRUCT ( out ) ;
make_spoolss_q_enumprinterdataex ( & in , hnd , keyname , offered ) ;
2008-07-21 14:50:32 +04:00
CLI_DO_RPC_WERR ( cli , mem_ctx , & syntax_spoolss , SPOOLSS_ENUMPRINTERDATAEX ,
2005-07-20 19:35:29 +04:00
in , out ,
qbuf , rbuf ,
spoolss_io_q_enumprinterdataex ,
spoolss_io_r_enumprinterdataex ,
WERR_GENERAL_FAILURE ) ;
}
2002-09-25 19:19:00 +04:00
2005-07-20 19:35:29 +04:00
if ( ! W_ERROR_IS_OK ( out . status ) )
return out . status ;
2002-09-25 19:19:00 +04:00
2005-07-20 19:35:29 +04:00
for ( i = 0 ; i < out . returned ; i + + ) {
PRINTER_ENUM_VALUES * v = & out . ctr . values [ i ] ;
2002-09-25 19:19:00 +04:00
fstring name ;
rpcstr_pull ( name , v - > valuename . buffer , sizeof ( name ) , - 1 ,
STR_TERMINATE ) ;
2003-08-15 08:42:05 +04:00
regval_ctr_addvalue ( ctr , name , v - > type , ( const char * ) v - > data , v - > data_len ) ;
2002-09-25 19:19:00 +04:00
}
2002-08-17 20:05:44 +04:00
2005-07-20 19:35:29 +04:00
return out . status ;
2002-08-17 20:05:44 +04:00
}
2005-07-20 19:35:29 +04:00
/**********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-08-17 20:05:44 +04:00
2005-09-30 21:13:37 +04:00
WERROR rpccli_spoolss_enumprinterkey ( struct rpc_pipe_client * cli , TALLOC_CTX * mem_ctx ,
2003-01-03 11:28:12 +03:00
POLICY_HND * hnd , const char * keyname ,
2002-11-08 23:36:31 +03:00
uint16 * * keylist , uint32 * len )
{
prs_struct qbuf , rbuf ;
2005-07-20 19:35:29 +04:00
SPOOL_Q_ENUMPRINTERKEY in ;
SPOOL_R_ENUMPRINTERKEY out ;
2005-07-28 19:01:29 +04:00
uint32 offered = 0 ;
2002-11-08 23:36:31 +03:00
2005-07-20 19:35:29 +04:00
ZERO_STRUCT ( in ) ;
ZERO_STRUCT ( out ) ;
2002-11-08 23:36:31 +03:00
2005-07-20 19:35:29 +04:00
make_spoolss_q_enumprinterkey ( & in , hnd , keyname , offered ) ;
2002-11-08 23:36:31 +03:00
2008-07-21 14:50:32 +04:00
CLI_DO_RPC_WERR ( cli , mem_ctx , & syntax_spoolss , SPOOLSS_ENUMPRINTERKEY ,
2005-07-20 19:35:29 +04:00
in , out ,
qbuf , rbuf ,
spoolss_io_q_enumprinterkey ,
spoolss_io_r_enumprinterkey ,
WERR_GENERAL_FAILURE ) ;
2002-11-08 23:36:31 +03:00
2005-07-20 19:35:29 +04:00
if ( W_ERROR_EQUAL ( out . status , WERR_MORE_DATA ) ) {
offered = out . needed ;
ZERO_STRUCT ( in ) ;
ZERO_STRUCT ( out ) ;
make_spoolss_q_enumprinterkey ( & in , hnd , keyname , offered ) ;
2008-07-21 14:50:32 +04:00
CLI_DO_RPC_WERR ( cli , mem_ctx , & syntax_spoolss , SPOOLSS_ENUMPRINTERKEY ,
2005-07-20 19:35:29 +04:00
in , out ,
qbuf , rbuf ,
spoolss_io_q_enumprinterkey ,
spoolss_io_r_enumprinterkey ,
WERR_GENERAL_FAILURE ) ;
}
2002-11-08 23:36:31 +03:00
2005-07-20 19:35:29 +04:00
if ( ! W_ERROR_IS_OK ( out . status ) )
return out . status ;
2002-11-08 23:36:31 +03:00
if ( keylist ) {
2005-07-20 19:35:29 +04:00
* keylist = SMB_MALLOC_ARRAY ( uint16 , out . keys . buf_len ) ;
2005-11-01 22:24:55 +03:00
if ( ! * keylist ) {
return WERR_NOMEM ;
}
2005-07-20 19:35:29 +04:00
memcpy ( * keylist , out . keys . buffer , out . keys . buf_len * 2 ) ;
2002-11-08 23:36:31 +03:00
if ( len )
2005-07-20 19:35:29 +04:00
* len = out . keys . buf_len * 2 ;
2002-11-08 23:36:31 +03:00
}
2005-07-20 19:35:29 +04:00
return out . status ;
2002-11-08 23:36:31 +03:00
}
2002-08-17 20:05:44 +04:00
/** @} **/