2005-02-16 13:04:52 +03:00
/*
Unix SMB / CIFS implementation .
WINS replication testing
Copyright ( C ) Andrew Tridgell 2005
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"
# include "libcli/nbt/libnbt.h"
# include "libcli/wins/winsrepl.h"
# define CHECK_STATUS(status, correct) do { \
if ( ! NT_STATUS_EQUAL ( status , correct ) ) { \
printf ( " (%s) Incorrect status %s - should be %s \n " , \
__location__ , nt_errstr ( status ) , nt_errstr ( correct ) ) ; \
ret = False ; \
goto done ; \
} } while ( 0 )
# define CHECK_VALUE(v, correct) do { \
if ( ( v ) ! = ( correct ) ) { \
printf ( " (%s) Incorrect value %s=%d - should be %d \n " , \
__location__ , # v , v , correct ) ; \
ret = False ; \
goto done ; \
} } while ( 0 )
/*
display a replication entry
*/
2005-02-19 02:13:51 +03:00
static void display_entry ( TALLOC_CTX * mem_ctx , struct wrepl_name * name )
2005-02-16 13:04:52 +03:00
{
int i ;
2005-02-19 02:13:51 +03:00
printf ( " %s \n " , nbt_name_string ( mem_ctx , & name - > name ) ) ;
for ( i = 0 ; i < name - > num_addresses ; i + + ) {
2005-02-16 13:04:52 +03:00
printf ( " \t %s %s \n " ,
2005-02-19 02:13:51 +03:00
name - > addresses [ i ] . owner , name - > addresses [ i ] . address ) ;
2005-02-16 13:04:52 +03:00
}
}
/*
test a full replication dump from a WINS server
*/
static BOOL nbt_test_wins_replication ( TALLOC_CTX * mem_ctx , const char * address )
{
BOOL ret = True ;
struct wrepl_socket * wrepl_socket ;
NTSTATUS status ;
int i , j ;
2005-02-19 02:13:51 +03:00
struct wrepl_associate associate ;
struct wrepl_pull_table pull_table ;
struct wrepl_pull_names pull_names ;
2005-02-16 13:04:52 +03:00
wrepl_socket = wrepl_socket_init ( mem_ctx , NULL ) ;
status = wrepl_connect ( wrepl_socket , address ) ;
CHECK_STATUS ( status , NT_STATUS_OK ) ;
printf ( " Send a start association request \n " ) ;
2005-02-19 02:13:51 +03:00
status = wrepl_associate ( wrepl_socket , & associate ) ;
2005-02-16 13:04:52 +03:00
CHECK_STATUS ( status , NT_STATUS_OK ) ;
2005-02-19 02:13:51 +03:00
printf ( " association context: 0x%x \n " , associate . out . assoc_ctx ) ;
2005-02-16 13:04:52 +03:00
printf ( " Send a replication table query \n " ) ;
2005-02-19 02:13:51 +03:00
pull_table . in . assoc_ctx = associate . out . assoc_ctx ;
2005-02-16 13:04:52 +03:00
2005-02-19 02:13:51 +03:00
status = wrepl_pull_table ( wrepl_socket , mem_ctx , & pull_table ) ;
2005-02-16 13:04:52 +03:00
CHECK_STATUS ( status , NT_STATUS_OK ) ;
2005-02-19 02:13:51 +03:00
printf ( " Found %d replication partners \n " , pull_table . out . num_partners ) ;
2005-02-16 13:04:52 +03:00
2005-02-19 02:13:51 +03:00
for ( i = 0 ; i < pull_table . out . num_partners ; i + + ) {
struct wrepl_wins_owner * partner = & pull_table . out . partners [ i ] ;
2005-02-16 13:04:52 +03:00
printf ( " %s max_version=%6llu min_version=%6llu type=%d \n " ,
2005-02-19 02:13:51 +03:00
partner - > address ,
partner - > max_version ,
partner - > min_version ,
partner - > type ) ;
pull_names . in . assoc_ctx = associate . out . assoc_ctx ;
pull_names . in . partner = * partner ;
status = wrepl_pull_names ( wrepl_socket , mem_ctx , & pull_names ) ;
2005-02-16 13:04:52 +03:00
CHECK_STATUS ( status , NT_STATUS_OK ) ;
2005-02-19 02:13:51 +03:00
printf ( " Received %d names \n " , pull_names . out . num_names ) ;
2005-02-16 13:04:52 +03:00
2005-02-19 02:13:51 +03:00
for ( j = 0 ; j < pull_names . out . num_names ; j + + ) {
display_entry ( mem_ctx , & pull_names . out . names [ j ] ) ;
2005-02-16 13:04:52 +03:00
}
}
done :
talloc_free ( wrepl_socket ) ;
return ret ;
}
/*
test WINS replication operations
*/
BOOL torture_nbt_winsreplication ( void )
{
const char * address ;
struct nbt_name name ;
TALLOC_CTX * mem_ctx = talloc_new ( NULL ) ;
NTSTATUS status ;
BOOL ret = True ;
name . name = lp_parm_string ( - 1 , " torture " , " host " ) ;
name . type = NBT_NAME_SERVER ;
name . scope = NULL ;
/* do an initial name resolution to find its IP */
status = resolve_name ( & name , mem_ctx , & address ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " Failed to resolve %s - %s \n " ,
name . name , nt_errstr ( status ) ) ;
talloc_free ( mem_ctx ) ;
return False ;
}
ret & = nbt_test_wins_replication ( mem_ctx , address ) ;
talloc_free ( mem_ctx ) ;
return ret ;
}