2003-11-21 16:14:17 +03:00
/*
Unix SMB / CIFS implementation .
test suite for epmapper rpc operations
Copyright ( C ) Andrew Tridgell 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-24 08:28:10 +03:00
/*
display any protocol tower
*/
2004-10-21 15:39:58 +04:00
static void display_tower ( TALLOC_CTX * mem_ctx , struct epm_tower * twr )
2003-11-24 08:28:10 +03:00
{
int i ;
const char * uuid ;
for ( i = 0 ; i < twr - > num_floors ; i + + ) {
struct epm_lhs * lhs = & twr - > floors [ i ] . lhs ;
2004-10-12 16:41:50 +04:00
union epm_rhs * rhs = & twr - > floors [ i ] . rhs ;
2004-10-12 00:12:51 +04:00
switch ( lhs - > protocol ) {
2003-11-27 10:28:46 +03:00
case EPM_PROTOCOL_UUID :
2003-11-24 08:28:10 +03:00
uuid = GUID_string ( mem_ctx , & lhs - > info . uuid . uuid ) ;
if ( strcasecmp ( uuid , NDR_GUID ) = = 0 ) {
printf ( " NDR " ) ;
} else {
printf ( " uuid %s/0x%02x " , uuid , lhs - > info . uuid . version ) ;
}
break ;
2003-11-27 10:28:46 +03:00
2004-10-12 00:12:51 +04:00
case EPM_PROTOCOL_NCACN :
2003-11-24 08:28:10 +03:00
printf ( " RPC-C " ) ;
break ;
2004-10-12 00:12:51 +04:00
case EPM_PROTOCOL_NCADG :
printf ( " RPC " ) ;
break ;
case EPM_PROTOCOL_NCALRPC :
printf ( " NCALRPC " ) ;
break ;
case EPM_PROTOCOL_DNET_NSP :
printf ( " DNET/NSP " ) ;
break ;
case EPM_PROTOCOL_IP :
2003-11-24 08:28:10 +03:00
printf ( " IP: " ) ;
2004-10-12 16:41:50 +04:00
{
2003-11-24 08:28:10 +03:00
struct in_addr in ;
2004-10-14 13:21:12 +04:00
in . s_addr = htonl ( rhs - > ip . address ) ;
2003-11-24 08:28:10 +03:00
printf ( " %s " , inet_ntoa ( in ) ) ;
}
break ;
2004-10-12 00:12:51 +04:00
case EPM_PROTOCOL_PIPE :
2004-10-12 16:41:50 +04:00
printf ( " PIPE:%s " , rhs - > pipe . path ) ;
2003-11-24 08:28:10 +03:00
break ;
2004-10-12 00:12:51 +04:00
case EPM_PROTOCOL_SMB :
2004-10-12 16:41:50 +04:00
printf ( " SMB:%s " , rhs - > smb . unc ) ;
2003-11-24 08:28:10 +03:00
break ;
2004-10-12 00:12:51 +04:00
case EPM_PROTOCOL_UNIX_DS :
2004-10-22 14:52:57 +04:00
printf ( " Unix:%s " , rhs - > unix_ds . path ) ;
2004-10-12 00:12:51 +04:00
break ;
case EPM_PROTOCOL_NETBIOS :
2004-10-12 16:41:50 +04:00
printf ( " NetBIOS:%s " , rhs - > netbios . name ) ;
2003-11-24 08:28:10 +03:00
break ;
2004-10-21 14:52:03 +04:00
case EPM_PROTOCOL_NETBEUI :
printf ( " NETBeui " ) ;
2004-08-11 00:55:42 +04:00
break ;
2004-10-12 00:12:51 +04:00
case EPM_PROTOCOL_SPX :
2004-08-11 00:55:42 +04:00
printf ( " SPX " ) ;
break ;
2004-10-12 00:12:51 +04:00
case EPM_PROTOCOL_NB_IPX :
2004-08-11 00:55:42 +04:00
printf ( " NB_IPX " ) ;
2004-10-12 00:12:51 +04:00
break ;
2004-08-11 00:55:42 +04:00
2004-10-12 00:12:51 +04:00
case EPM_PROTOCOL_HTTP :
2004-10-12 16:41:50 +04:00
printf ( " HTTP:%d " , rhs - > http . port ) ;
2003-11-26 04:16:41 +03:00
break ;
2004-10-12 00:12:51 +04:00
case EPM_PROTOCOL_TCP :
2003-11-26 04:16:41 +03:00
/* what is the difference between this and 0x1f? */
2004-10-12 16:41:50 +04:00
printf ( " TCP:%d " , rhs - > tcp . port ) ;
2003-11-24 08:28:10 +03:00
break ;
2004-10-12 00:12:51 +04:00
case EPM_PROTOCOL_UDP :
2004-10-12 16:41:50 +04:00
printf ( " UDP:%d " , rhs - > udp . port ) ;
2004-08-11 00:55:42 +04:00
break ;
2003-11-24 08:28:10 +03:00
default :
printf ( " UNK(%02x): " , lhs - > protocol ) ;
2004-10-12 16:41:50 +04:00
if ( rhs - > unknown . length = = 2 ) {
printf ( " %d " , RSVAL ( rhs - > unknown . data , 0 ) ) ;
2003-11-24 08:28:10 +03:00
}
break ;
}
}
printf ( " \n " ) ;
}
2003-11-24 13:15:17 +03:00
static BOOL test_Map ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct epm_twr_t * twr )
{
NTSTATUS status ;
struct epm_Map r ;
2003-12-16 12:02:58 +03:00
struct GUID uuid ;
2003-11-27 10:28:46 +03:00
const char * uuid_str ;
2003-11-24 13:15:17 +03:00
struct policy_handle handle ;
2004-10-31 21:37:59 +03:00
int i , j ;
const char * test_bindings [ ] = { " ncacn_np: " , " ncacn_ip_tcp: " , " ncalrpc: " , " ncadg_ip_udp: " } ;
2003-11-24 13:15:17 +03:00
ZERO_STRUCT ( uuid ) ;
ZERO_STRUCT ( handle ) ;
r . in . object = & uuid ;
r . in . map_tower = twr ;
r . in . entry_handle = & handle ;
r . out . entry_handle = & handle ;
r . in . max_towers = 100 ;
2004-10-21 14:52:03 +04:00
uuid_str = GUID_string ( mem_ctx , & twr - > tower . floors [ 0 ] . lhs . info . uuid . uuid ) ;
2003-11-27 10:28:46 +03:00
printf ( " epm_Map results for '%s': \n " ,
2004-10-21 14:52:03 +04:00
idl_pipe_name ( uuid_str , twr - > tower . floors [ 0 ] . lhs . info . uuid . version ) ) ;
2003-11-27 10:28:46 +03:00
2004-10-31 21:37:59 +03:00
for ( i = 0 ; i < ARRAY_SIZE ( test_bindings ) ; i + + )
{
struct dcerpc_binding binding ;
status = dcerpc_parse_binding ( mem_ctx , test_bindings [ i ] , & binding ) ;
2003-11-27 10:28:46 +03:00
2004-10-31 21:37:59 +03:00
if ( NT_STATUS_IS_ERR ( status ) ) {
printf ( " Error parsing binding string '%s' \n " , test_bindings [ i ] ) ;
return False ;
2003-11-27 10:28:46 +03:00
}
2003-11-24 13:15:17 +03:00
2004-10-31 21:37:59 +03:00
binding . object = twr - > tower . floors [ 0 ] . lhs . info . uuid . uuid ;
binding . object_version = twr - > tower . floors [ 0 ] . lhs . info . uuid . version ;
status = dcerpc_binding_build_tower ( mem_ctx , & binding , & twr - > tower ) ;
if ( NT_STATUS_IS_ERR ( status ) ) {
printf ( " Error parsing binding string '%s' \n " , test_bindings [ i ] ) ;
return False ;
}
status = dcerpc_epm_Map ( p , mem_ctx , & r ) ;
if ( NT_STATUS_IS_OK ( status ) & & r . out . result = = 0 ) {
for ( j = 0 ; j < r . out . num_towers ; j + + ) {
if ( r . out . towers [ j ] . twr ) {
display_tower ( mem_ctx , & r . out . towers [ j ] . twr - > tower ) ;
}
2003-11-27 10:28:46 +03:00
}
}
}
2003-11-24 13:15:17 +03:00
return True ;
}
2003-11-21 16:14:17 +03:00
static BOOL test_Lookup ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx )
{
NTSTATUS status ;
struct epm_Lookup r ;
struct GUID uuid ;
struct rpc_if_id_t iface ;
struct policy_handle handle ;
ZERO_STRUCT ( uuid ) ;
ZERO_STRUCT ( iface ) ;
ZERO_STRUCT ( handle ) ;
r . in . inquiry_type = 0 ;
r . in . object = & uuid ;
r . in . interface_id = & iface ;
r . in . vers_option = 0 ;
r . in . entry_handle = & handle ;
r . out . entry_handle = & handle ;
2003-11-24 08:28:10 +03:00
r . in . max_ents = 10 ;
2003-11-21 16:14:17 +03:00
do {
2003-11-24 13:15:17 +03:00
int i ;
2003-11-21 16:14:17 +03:00
status = dcerpc_epm_Lookup ( p , mem_ctx , & r ) ;
2004-08-14 09:53:53 +04:00
if ( ! NT_STATUS_IS_OK ( status ) | | r . out . result ! = 0 ) {
2003-11-24 13:15:17 +03:00
break ;
}
for ( i = 0 ; i < r . out . num_ents ; i + + ) {
printf ( " \n Found '%s' \n " , r . out . entries [ i ] . annotation ) ;
2004-10-21 14:52:03 +04:00
display_tower ( mem_ctx , & r . out . entries [ i ] . tower - > tower ) ;
2004-10-27 07:15:42 +04:00
if ( r . out . entries [ i ] . tower - > tower . num_floors = = 5 ) {
test_Map ( p , mem_ctx , r . out . entries [ i ] . tower ) ;
}
2003-11-21 16:14:17 +03:00
}
2003-11-24 08:28:10 +03:00
} while ( NT_STATUS_IS_OK ( status ) & &
2004-08-14 09:53:53 +04:00
r . out . result = = 0 & &
2003-11-24 08:28:10 +03:00
r . out . num_ents = = r . in . max_ents ) ;
2003-11-21 16:14:17 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " Lookup failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
return True ;
}
2004-10-28 17:40:50 +04:00
BOOL torture_rpc_epmapper ( void )
2003-11-21 16:14:17 +03:00
{
NTSTATUS status ;
struct dcerpc_pipe * p ;
TALLOC_CTX * mem_ctx ;
BOOL ret = True ;
mem_ctx = talloc_init ( " torture_rpc_epmapper " ) ;
2003-11-24 16:19:00 +03:00
status = torture_rpc_connection ( & p ,
DCERPC_EPMAPPER_NAME ,
DCERPC_EPMAPPER_UUID ,
DCERPC_EPMAPPER_VERSION ) ;
2003-11-21 16:14:17 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return False ;
}
if ( ! test_Lookup ( p , mem_ctx ) ) {
ret = False ;
}
2003-11-22 11:11:32 +03:00
talloc_destroy ( mem_ctx ) ;
2003-11-21 16:14:17 +03:00
torture_rpc_close ( p ) ;
return ret ;
}