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 ;
}
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 ;
if ( offered > 0 ) {
buffer = data_blob_talloc_zero ( mem_ctx , offered ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
}
status = rpccli_spoolss_EnumPrinterDrivers ( cli , mem_ctx ,
server ,
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_EnumPrinterDrivers ( cli , mem_ctx ,
server ,
environment ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
}
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 ;
if ( offered > 0 ) {
buffer = data_blob_talloc_zero ( mem_ctx , offered ) ;
W_ERROR_HAVE_NO_MEMORY ( buffer . data ) ;
}
status = rpccli_spoolss_EnumPrinters ( cli , mem_ctx ,
flags ,
server ,
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_EnumPrinters ( cli , mem_ctx ,
flags ,
server ,
level ,
( offered > 0 ) ? & buffer : NULL ,
offered ,
count ,
info ,
& needed ,
& werror ) ;
}
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 ,
union spoolss_PrinterData * data )
{
NTSTATUS status ;
WERROR werror ;
uint32_t needed ;
status = rpccli_spoolss_GetPrinterData ( cli , mem_ctx ,
handle ,
value_name ,
offered ,
type ,
data ,
& needed ,
& werror ) ;
if ( W_ERROR_EQUAL ( werror , WERR_MORE_DATA ) ) {
offered = needed ;
status = rpccli_spoolss_GetPrinterData ( cli , mem_ctx ,
handle ,
value_name ,
offered ,
type ,
data ,
& 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
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
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
/** @} **/