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 ;
}
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
2004-08-26 01:26:37 +04:00
/**********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-11-01 22:24:55 +03:00
2007-10-19 04:40:25 +04:00
static bool decode_printer_info_7 ( TALLOC_CTX * mem_ctx , RPC_BUFFER * buffer ,
2004-08-26 01:26:37 +04:00
uint32 returned , PRINTER_INFO_7 * * info )
{
uint32 i ;
PRINTER_INFO_7 * inf ;
2007-04-30 06:39:34 +04:00
if ( returned ) {
inf = TALLOC_ARRAY ( mem_ctx , PRINTER_INFO_7 , returned ) ;
if ( ! inf ) {
return False ;
}
memset ( inf , 0 , returned * sizeof ( PRINTER_INFO_7 ) ) ;
} else {
inf = NULL ;
2005-11-01 22:24:55 +03:00
}
2004-08-26 01:26:37 +04:00
prs_set_offset ( & buffer - > prs , 0 ) ;
for ( i = 0 ; i < returned ; i + + ) {
2005-11-01 22:24:55 +03:00
if ( ! smb_io_printer_info_7 ( " " , buffer , & inf [ i ] , 0 ) ) {
return False ;
}
2004-08-26 01:26:37 +04:00
}
* info = inf ;
2005-11-01 22:24:55 +03:00
return True ;
2004-08-26 01:26:37 +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_port_info_1 ( TALLOC_CTX * mem_ctx , RPC_BUFFER * buffer ,
2002-08-17 20:05:44 +04:00
uint32 returned , PORT_INFO_1 * * info )
{
2005-11-01 22:24:55 +03:00
uint32 i ;
PORT_INFO_1 * inf ;
2000-07-22 00:03:18 +04:00
2007-04-30 06:39:34 +04:00
if ( returned ) {
inf = TALLOC_ARRAY ( mem_ctx , PORT_INFO_1 , returned ) ;
if ( ! inf ) {
return False ;
}
memset ( inf , 0 , returned * sizeof ( PORT_INFO_1 ) ) ;
} else {
inf = NULL ;
2005-11-01 22:24:55 +03:00
}
2000-07-22 00:03:18 +04:00
2005-11-01 22:24:55 +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_port_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 ;
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_port_info_2 ( TALLOC_CTX * mem_ctx , RPC_BUFFER * buffer ,
2002-08-17 20:05:44 +04:00
uint32 returned , PORT_INFO_2 * * info )
{
2005-11-01 22:24:55 +03:00
uint32 i ;
PORT_INFO_2 * inf ;
2000-07-22 00:03:18 +04:00
2007-04-30 06:39:34 +04:00
if ( returned ) {
inf = TALLOC_ARRAY ( mem_ctx , PORT_INFO_2 , returned ) ;
if ( ! inf ) {
return False ;
}
memset ( inf , 0 , returned * sizeof ( PORT_INFO_2 ) ) ;
} else {
inf = NULL ;
2005-11-01 22:24:55 +03:00
}
2000-07-22 00:03:18 +04:00
2005-11-01 22:24:55 +03:00
prs_set_offset ( & buffer - > prs , 0 ) ;
2002-08-17 20:05:44 +04:00
2005-11-01 22:24:55 +03:00
for ( i = 0 ; i < returned ; i + + ) {
if ( ! smb_io_port_info_2 ( " " , 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 ;
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
2007-10-19 04:40:25 +04:00
static bool decode_jobs_1 ( TALLOC_CTX * mem_ctx , RPC_BUFFER * buffer ,
2005-07-20 19:35:29 +04:00
uint32 num_jobs , JOB_INFO_1 * * jobs )
2000-07-14 21:01:49 +04:00
{
2005-07-20 19:35:29 +04:00
uint32 i ;
2002-08-17 20:05:44 +04:00
2007-04-30 06:39:34 +04:00
if ( num_jobs ) {
* jobs = TALLOC_ARRAY ( mem_ctx , JOB_INFO_1 , num_jobs ) ;
if ( * jobs = = NULL ) {
return False ;
}
} else {
* jobs = NULL ;
2005-11-01 22:24:55 +03:00
}
2005-07-20 19:35:29 +04:00
prs_set_offset ( & buffer - > prs , 0 ) ;
2002-08-17 20:05:44 +04:00
2005-11-01 22:24:55 +03:00
for ( i = 0 ; i < num_jobs ; i + + ) {
if ( ! smb_io_job_info_1 ( " " , buffer , & ( ( * jobs ) [ i ] ) , 0 ) ) {
return False ;
}
}
return True ;
2005-07-20 19:35:29 +04:00
}
2002-08-17 20:05:44 +04:00
2005-07-20 19:35:29 +04:00
/**********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-08-17 20:05:44 +04:00
2007-10-19 04:40:25 +04:00
static bool decode_jobs_2 ( TALLOC_CTX * mem_ctx , RPC_BUFFER * buffer ,
2005-07-20 19:35:29 +04:00
uint32 num_jobs , JOB_INFO_2 * * jobs )
{
uint32 i ;
2002-08-17 20:05:44 +04:00
2007-04-30 06:39:34 +04:00
if ( num_jobs ) {
* jobs = TALLOC_ARRAY ( mem_ctx , JOB_INFO_2 , num_jobs ) ;
if ( * jobs = = NULL ) {
return False ;
}
} else {
* jobs = NULL ;
2005-11-01 22:24:55 +03:00
}
2005-07-20 19:35:29 +04: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 < num_jobs ; i + + ) {
if ( ! smb_io_job_info_2 ( " " , buffer , & ( ( * jobs ) [ i ] ) , 0 ) ) {
return False ;
}
}
return True ;
2005-07-20 19:35:29 +04:00
}
2000-07-14 21:01:49 +04:00
2005-07-20 19:35:29 +04:00
/**********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-08-17 20:05:44 +04:00
2007-10-19 04:40:25 +04:00
static bool decode_forms_1 ( TALLOC_CTX * mem_ctx , RPC_BUFFER * buffer ,
2005-07-20 19:35:29 +04:00
uint32 num_forms , FORM_1 * * forms )
{
int i ;
2002-08-17 20:05:44 +04:00
2007-04-30 06:39:34 +04:00
if ( num_forms ) {
* forms = TALLOC_ARRAY ( mem_ctx , FORM_1 , num_forms ) ;
if ( * forms = = NULL ) {
return False ;
}
} else {
* forms = NULL ;
2005-11-01 22:24:55 +03:00
}
2007-04-30 06:39:34 +04:00
2005-07-20 19:35:29 +04:00
prs_set_offset ( & buffer - > prs , 0 ) ;
2002-08-17 20:05:44 +04:00
2005-11-01 22:24:55 +03:00
for ( i = 0 ; i < num_forms ; i + + ) {
if ( ! smb_io_form_1 ( " " , buffer , & ( ( * forms ) [ i ] ) , 0 ) ) {
return False ;
}
}
return True ;
2000-07-14 21:01:49 +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_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_enum_ports ( struct rpc_pipe_client * cli , TALLOC_CTX * mem_ctx ,
2002-10-21 08:07:56 +04:00
uint32 level , uint32 * num_ports , PORT_INFO_CTR * ctr )
2002-08-17 20:05:44 +04:00
{
prs_struct qbuf , rbuf ;
2005-07-20 19:35:29 +04:00
SPOOL_Q_ENUMPORTS in ;
SPOOL_R_ENUMPORTS 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 ;
2000-07-14 21:01:49 +04:00
2005-07-20 19:35:29 +04:00
ZERO_STRUCT ( in ) ;
ZERO_STRUCT ( out ) ;
2000-07-14 21:01:49 +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 ) ;
2000-07-14 21:01:49 +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_enumports ( & in , server , level , & buffer , 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_ENUMPORTS ,
2005-07-20 19:35:29 +04:00
in , out ,
qbuf , rbuf ,
spoolss_io_q_enumports ,
spoolss_io_r_enumports ,
WERR_GENERAL_FAILURE ) ;
if ( W_ERROR_EQUAL ( out . status , WERR_INSUFFICIENT_BUFFER ) ) {
offered = out . needed ;
2002-08-17 20:05:44 +04:00
2005-07-20 19:35:29 +04:00
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_enumports ( & in , server , level , & buffer , offered ) ;
2008-07-21 14:50:32 +04:00
CLI_DO_RPC_WERR ( cli , mem_ctx , & syntax_spoolss , SPOOLSS_ENUMPORTS ,
2005-07-20 19:35:29 +04:00
in , out ,
qbuf , rbuf ,
spoolss_io_q_enumports ,
spoolss_io_r_enumports ,
WERR_GENERAL_FAILURE ) ;
}
if ( ! W_ERROR_IS_OK ( out . status ) )
return out . status ;
2002-08-17 20:05:44 +04:00
switch ( level ) {
case 1 :
2005-11-01 22:24:55 +03:00
if ( ! decode_port_info_1 ( mem_ctx , out . buffer , out . returned , & ctr - > port . info_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_port_info_2 ( mem_ctx , out . buffer , out . returned , & ctr - > port . info_2 ) ) {
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 ;
}
2002-08-17 20:05:44 +04:00
2005-07-20 19:35:29 +04:00
* num_ports = out . returned ;
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_getprinter ( struct rpc_pipe_client * cli , TALLOC_CTX * mem_ctx ,
2002-08-17 20:05:44 +04:00
POLICY_HND * pol , uint32 level ,
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_GETPRINTER in ;
SPOOL_R_GETPRINTER 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
/* Initialise input parameters */
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_getprinter ( mem_ctx , & in , pol , level , & buffer , 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_GETPRINTER ,
2005-07-20 19:35:29 +04:00
in , out ,
qbuf , rbuf ,
spoolss_io_q_getprinter ,
spoolss_io_r_getprinter ,
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_getprinter ( mem_ctx , & in , pol , level , & buffer , offered ) ;
2008-07-21 14:50:32 +04:00
CLI_DO_RPC_WERR ( cli , mem_ctx , & syntax_spoolss , SPOOLSS_GETPRINTER ,
2005-07-20 19:35:29 +04:00
in , out ,
qbuf , rbuf ,
spoolss_io_q_getprinter ,
spoolss_io_r_getprinter ,
WERR_GENERAL_FAILURE ) ;
2000-07-31 18:50:53 +04:00
}
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 ;
switch ( level ) {
case 0 :
2005-11-01 22:24:55 +03:00
if ( ! decode_printer_info_0 ( mem_ctx , out . buffer , 1 , & ctr - > printers_0 ) ) {
return WERR_GENERAL_FAILURE ;
}
2005-07-20 19:35:29 +04:00
break ;
case 1 :
2005-11-01 22:24:55 +03:00
if ( ! decode_printer_info_1 ( mem_ctx , out . buffer , 1 , & ctr - > printers_1 ) ) {
return WERR_GENERAL_FAILURE ;
}
2005-07-20 19:35:29 +04:00
break ;
case 2 :
2005-11-01 22:24:55 +03:00
if ( ! decode_printer_info_2 ( mem_ctx , out . buffer , 1 , & ctr - > printers_2 ) ) {
return WERR_GENERAL_FAILURE ;
}
2005-07-20 19:35:29 +04:00
break ;
case 3 :
2005-11-01 22:24:55 +03:00
if ( ! decode_printer_info_3 ( mem_ctx , out . buffer , 1 , & ctr - > printers_3 ) ) {
return WERR_GENERAL_FAILURE ;
}
2005-07-20 19:35:29 +04:00
break ;
case 7 :
2005-11-01 22:24:55 +03:00
if ( ! decode_printer_info_7 ( mem_ctx , out . buffer , 1 , & ctr - > printers_7 ) ) {
return WERR_GENERAL_FAILURE ;
}
2005-07-20 19:35:29 +04:00
break ;
2005-11-01 22:24:55 +03:00
default :
return WERR_UNKNOWN_LEVEL ;
}
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
}
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_setprinter ( struct rpc_pipe_client * cli , TALLOC_CTX * mem_ctx ,
2002-08-17 20:05:44 +04:00
POLICY_HND * pol , uint32 level ,
PRINTER_INFO_CTR * ctr , uint32 command )
{
prs_struct qbuf , rbuf ;
2005-07-20 19:35:29 +04:00
SPOOL_Q_SETPRINTER in ;
SPOOL_R_SETPRINTER out ;
2000-07-14 21:01:49 +04:00
2005-07-20 19:35:29 +04:00
ZERO_STRUCT ( in ) ;
ZERO_STRUCT ( out ) ;
2000-07-18 09:07:28 +04:00
2005-07-20 19:35:29 +04:00
make_spoolss_q_setprinter ( mem_ctx , & in , pol , level , ctr , command ) ;
2000-07-14 21:01:49 +04:00
2008-07-21 14:50:32 +04:00
CLI_DO_RPC_WERR ( cli , mem_ctx , & syntax_spoolss , SPOOLSS_SETPRINTER ,
2005-07-20 19:35:29 +04:00
in , out ,
qbuf , rbuf ,
spoolss_io_q_setprinter ,
spoolss_io_r_setprinter ,
WERR_GENERAL_FAILURE ) ;
2000-07-14 21:01:49 +04:00
2005-07-20 19:35:29 +04:00
return out . status ;
2000-07-14 21:01:49 +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_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_addprinterex ( struct rpc_pipe_client * cli , TALLOC_CTX * mem_ctx ,
2002-08-17 20:05:44 +04:00
uint32 level , PRINTER_INFO_CTR * ctr )
2000-07-14 21:01:49 +04:00
{
2005-07-20 19:35:29 +04:00
prs_struct qbuf , rbuf ;
SPOOL_Q_ADDPRINTEREX in ;
SPOOL_R_ADDPRINTEREX out ;
fstring server , client , user ;
2000-07-14 21:01:49 +04:00
2005-07-20 19:35:29 +04:00
ZERO_STRUCT ( in ) ;
ZERO_STRUCT ( out ) ;
2005-09-30 21:13:37 +04:00
slprintf ( client , sizeof ( fstring ) - 1 , " \\ \\ %s " , global_myname ( ) ) ;
2008-04-19 23:56:43 +04:00
slprintf ( server , sizeof ( fstring ) - 1 , " \\ \\ %s " , cli - > desthost ) ;
2005-07-20 19:35:29 +04:00
strupper_m ( client ) ;
2003-07-03 23:11:31 +04:00
strupper_m ( server ) ;
2000-07-14 21:01:49 +04:00
2008-04-22 00:27:29 +04:00
fstrcpy ( user , cli - > auth - > user_name ) ;
2000-07-14 21:01:49 +04:00
2005-07-20 19:35:29 +04:00
make_spoolss_q_addprinterex ( mem_ctx , & in , server , client ,
user , level , ctr ) ;
2000-07-14 21:01:49 +04:00
2008-07-21 14:50:32 +04:00
CLI_DO_RPC_WERR ( cli , mem_ctx , & syntax_spoolss , SPOOLSS_ADDPRINTEREX ,
2005-07-20 19:35:29 +04:00
in , out ,
qbuf , rbuf ,
spoolss_io_q_addprinterex ,
spoolss_io_r_addprinterex ,
WERR_GENERAL_FAILURE ) ;
2000-07-14 21:01:49 +04:00
2005-07-20 19:35:29 +04:00
return out . status ;
2000-07-14 21:01:49 +04:00
}
2004-11-10 00:15:14 +03:00
/**********************************************************************
2005-07-20 19:35:29 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-09-30 21:13:37 +04:00
WERROR rpccli_spoolss_enumforms ( struct rpc_pipe_client * cli , TALLOC_CTX * mem_ctx ,
2002-08-17 20:05:44 +04:00
POLICY_HND * handle , int level , uint32 * num_forms ,
FORM_1 * * forms )
{
prs_struct qbuf , rbuf ;
2005-07-20 19:35:29 +04:00
SPOOL_Q_ENUMFORMS in ;
SPOOL_R_ENUMFORMS 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_enumforms ( & in , handle , level , & buffer , 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_ENUMFORMS ,
2005-07-20 19:35:29 +04:00
in , out ,
qbuf , rbuf ,
spoolss_io_q_enumforms ,
spoolss_io_r_enumforms ,
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_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_enumforms ( & in , handle , level , & buffer , offered ) ;
2008-07-21 14:50:32 +04:00
CLI_DO_RPC_WERR ( cli , mem_ctx , & syntax_spoolss , SPOOLSS_ENUMFORMS ,
2005-07-20 19:35:29 +04:00
in , out ,
qbuf , rbuf ,
spoolss_io_q_enumforms ,
spoolss_io_r_enumforms ,
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
2005-07-20 19:35:29 +04:00
* num_forms = out . numofforms ;
2005-11-01 22:24:55 +03:00
if ( ! decode_forms_1 ( mem_ctx , out . buffer , * num_forms , forms ) ) {
return WERR_GENERAL_FAILURE ;
}
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_enumjobs ( struct rpc_pipe_client * cli , TALLOC_CTX * mem_ctx ,
2002-08-17 20:05:44 +04:00
POLICY_HND * hnd , uint32 level , uint32 firstjob ,
uint32 num_jobs , uint32 * returned , JOB_INFO_CTR * ctr )
{
prs_struct qbuf , rbuf ;
2005-07-20 19:35:29 +04:00
SPOOL_Q_ENUMJOBS in ;
SPOOL_R_ENUMJOBS 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_enumjobs ( & in , hnd , firstjob , num_jobs , level ,
& buffer , offered ) ;
2008-07-21 14:50:32 +04:00
CLI_DO_RPC_WERR ( cli , mem_ctx , & syntax_spoolss , SPOOLSS_ENUMJOBS ,
2005-07-20 19:35:29 +04:00
in , out ,
qbuf , rbuf ,
spoolss_io_q_enumjobs ,
spoolss_io_r_enumjobs ,
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_enumjobs ( & in , hnd , firstjob , num_jobs , level ,
& buffer , offered ) ;
2008-07-21 14:50:32 +04:00
CLI_DO_RPC_WERR ( cli , mem_ctx , & syntax_spoolss , SPOOLSS_ENUMJOBS ,
2005-07-20 19:35:29 +04:00
in , out ,
qbuf , rbuf ,
spoolss_io_q_enumjobs ,
spoolss_io_r_enumjobs ,
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 1 :
2005-11-01 22:24:55 +03:00
if ( ! decode_jobs_1 ( mem_ctx , out . buffer , out . returned , & ctr - > job . job_info_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_jobs_2 ( mem_ctx , out . buffer , out . returned , & ctr - > job . job_info_2 ) ) {
return WERR_GENERAL_FAILURE ;
}
2002-08-17 20:05:44 +04:00
break ;
default :
DEBUG ( 3 , ( " unsupported info level %d " , level ) ) ;
2005-11-01 22:24:55 +03:00
return WERR_UNKNOWN_LEVEL ;
2002-08-17 20:05:44 +04:00
}
2005-07-20 19:35:29 +04:00
* returned = out . returned ;
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_getjob ( struct rpc_pipe_client * cli , TALLOC_CTX * mem_ctx ,
2002-08-17 20:05:44 +04:00
POLICY_HND * hnd , uint32 jobid , uint32 level ,
JOB_INFO_CTR * ctr )
{
prs_struct qbuf , rbuf ;
2005-07-20 19:35:29 +04:00
SPOOL_Q_GETJOB in ;
SPOOL_R_GETJOB 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_getjob ( & in , hnd , jobid , level , & buffer , 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_GETJOB ,
2005-07-20 19:35:29 +04:00
in , out ,
qbuf , rbuf ,
spoolss_io_q_getjob ,
spoolss_io_r_getjob ,
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 ) ;
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_getjob ( & in , hnd , jobid , level , & buffer , offered ) ;
2008-07-21 14:50:32 +04:00
CLI_DO_RPC_WERR ( cli , mem_ctx , & syntax_spoolss , SPOOLSS_GETJOB ,
2005-07-20 19:35:29 +04:00
in , out ,
qbuf , rbuf ,
spoolss_io_q_getjob ,
spoolss_io_r_getjob ,
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 1 :
2005-11-01 22:24:55 +03:00
if ( ! decode_jobs_1 ( mem_ctx , out . buffer , 1 , & ctr - > job . job_info_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_jobs_2 ( mem_ctx , out . buffer , 1 , & ctr - > job . job_info_2 ) ) {
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 ;
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_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
/** @} **/