2003-11-15 08:42:49 +03:00
/*
Unix SMB / CIFS implementation .
test suite for spoolss rpc operations
Copyright ( C ) Tim Potter 2003
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
the Free Software Foundation ; either version 2 of the License , or
( 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
along with this program ; if not , write to the Free Software
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
# include "includes.h"
2003-11-16 07:20:29 +03:00
static BOOL test_EnumPrinters ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx )
{
struct spoolss_EnumPrinters r ;
NTSTATUS status ;
2003-11-17 05:58:10 +03:00
uint16 levels [ ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 } ;
2003-11-16 16:49:14 +03:00
int i ;
BOOL ret = True ;
2003-11-16 07:20:29 +03:00
2003-11-16 16:49:14 +03:00
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
2003-11-17 05:18:11 +03:00
uint32 buf_size = 0 ;
union spoolss_PrinterEnum * info ;
int j ;
2003-11-16 16:49:14 +03:00
r . in . flags = 0x02 ;
r . in . server = " " ;
r . in . level = levels [ i ] ;
2003-11-17 05:18:11 +03:00
r . in . buffer = NULL ;
r . in . buf_size = & buf_size ;
r . out . buf_size = & buf_size ;
2003-11-16 07:20:29 +03:00
2003-11-16 16:49:14 +03:00
printf ( " \n Testing EnumPrinters level %u \n " , r . in . level ) ;
2003-11-16 07:20:29 +03:00
status = dcerpc_spoolss_EnumPrinters ( p , mem_ctx , & r ) ;
2003-11-16 16:49:14 +03:00
if ( NT_STATUS_IS_ERR ( status ) ) {
printf ( " EnumPrinters failed - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
continue ;
}
2003-11-17 05:58:10 +03:00
if ( W_ERROR_EQUAL ( r . out . result , WERR_INSUFFICIENT_BUFFER ) ) {
2003-11-17 05:18:11 +03:00
DATA_BLOB blob = data_blob_talloc ( mem_ctx , NULL , buf_size ) ;
data_blob_clear ( & blob ) ;
r . in . buffer = & blob ;
2003-11-16 16:49:14 +03:00
status = dcerpc_spoolss_EnumPrinters ( p , mem_ctx , & r ) ;
}
2003-11-17 05:58:10 +03:00
if ( ! NT_STATUS_IS_OK ( status ) | |
! W_ERROR_IS_OK ( r . out . result ) ) {
printf ( " EnumPrinters failed - %s/%s \n " ,
nt_errstr ( status ) , win_errstr ( r . out . result ) ) ;
continue ;
2003-11-16 16:49:14 +03:00
}
2003-11-16 14:36:59 +03:00
2003-11-17 05:18:11 +03:00
status = pull_spoolss_PrinterEnumArray ( r . out . buffer , mem_ctx , r . in . level , r . out . count , & info ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " EnumPrintersArray parse failed - %s \n " , nt_errstr ( status ) ) ;
2003-11-17 05:58:10 +03:00
continue ;
2003-11-17 05:18:11 +03:00
}
for ( j = 0 ; j < r . out . count ; j + + ) {
printf ( " Printer %d \n " , j ) ;
NDR_PRINT_UNION_DEBUG ( spoolss_PrinterEnum , r . in . level , & info [ j ] ) ;
2003-11-16 16:49:14 +03:00
}
2003-11-16 07:20:29 +03:00
}
2003-11-16 16:49:14 +03:00
return ret ;
2003-11-16 07:20:29 +03:00
}
static BOOL test_OpenPrinterEx ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
2003-11-15 08:42:49 +03:00
{
struct spoolss_OpenPrinterEx r ;
struct spoolss_UserLevel1 userlevel1 ;
NTSTATUS status ;
2003-11-16 07:20:29 +03:00
r . in . printername = " \\ \\ movingforward \\ p " ;
2003-11-15 08:42:49 +03:00
r . in . datatype = NULL ;
r . in . devmode_ctr . size = 0 ;
r . in . devmode_ctr . devmode = NULL ;
2003-11-16 07:20:29 +03:00
r . in . access_required = 0x02000000 ;
2003-11-15 08:42:49 +03:00
r . in . level = 1 ;
2003-11-16 07:20:29 +03:00
r . out . handle = handle ;
2003-11-15 23:56:18 +03:00
2003-11-15 08:42:49 +03:00
userlevel1 . size = 1234 ;
userlevel1 . client = " hello " ;
userlevel1 . user = " spottyfoot! " ;
userlevel1 . build = 1 ;
userlevel1 . major = 2 ;
userlevel1 . minor = 3 ;
userlevel1 . processor = 4 ;
r . in . userlevel . level1 = & userlevel1 ;
status = dcerpc_spoolss_OpenPrinterEx ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " OpenPrinter failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
return True ;
}
2003-11-16 07:20:29 +03:00
static BOOL test_ClosePrinter ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
{
struct spoolss_ClosePrinter r ;
struct policy_handle handle2 ;
NTSTATUS status ;
r . in . handle = handle ;
r . out . handle = & handle2 ;
status = dcerpc_spoolss_ClosePrinter ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " ClosePrinter failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
return True ;
}
2003-11-15 08:42:49 +03:00
BOOL torture_rpc_spoolss ( int dummy )
{
NTSTATUS status ;
struct dcerpc_pipe * p ;
TALLOC_CTX * mem_ctx ;
BOOL ret = True ;
2003-11-16 07:20:29 +03:00
struct policy_handle handle ;
2003-11-15 08:42:49 +03:00
mem_ctx = talloc_init ( " torture_rpc_spoolss " ) ;
status = torture_rpc_connection ( & p , " spoolss " ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
return False ;
}
2003-11-16 07:20:29 +03:00
if ( ! test_EnumPrinters ( p , mem_ctx ) ) {
ret = False ;
}
if ( ! test_OpenPrinterEx ( p , mem_ctx , & handle ) ) {
ret = False ;
}
if ( ! test_ClosePrinter ( p , mem_ctx , & handle ) ) {
2003-11-15 08:42:49 +03:00
ret = False ;
}
torture_rpc_close ( p ) ;
return ret ;
}