2003-08-13 01:53:07 +00:00
/*
Unix SMB / CIFS implementation .
test suite for various lock 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"
# define CHECK_STATUS(status, correct) do { \
if ( ! NT_STATUS_EQUAL ( status , correct ) ) { \
printf ( " (%d) Incorrect status %s - should be %s \n " , \
__LINE__ , nt_errstr ( status ) , nt_errstr ( correct ) ) ; \
ret = False ; \
goto done ; \
} } while ( 0 )
# define CHECK_VALUE(v, correct) do { \
if ( ( v ) ! = ( correct ) ) { \
printf ( " (%d) Incorrect value %s=%d - should be %d \n " , \
__LINE__ , # v , v , correct ) ; \
ret = False ; \
goto done ; \
} } while ( 0 )
# define BASEDIR "\\testlock"
/*
test SMBlock and SMBunlock ops
*/
static BOOL test_lock ( struct cli_state * cli , TALLOC_CTX * mem_ctx )
{
union smb_lock io ;
NTSTATUS status ;
BOOL ret = True ;
int fnum ;
const char * fname = BASEDIR " \\ test.txt " ;
if ( cli_deltree ( cli , BASEDIR ) = = - 1 | |
! cli_mkdir ( cli , BASEDIR ) ) {
printf ( " Unable to setup %s - %s \n " , BASEDIR , cli_errstr ( cli ) ) ;
return False ;
}
printf ( " Testing RAW_LOCK_LOCK \n " ) ;
io . generic . level = RAW_LOCK_LOCK ;
fnum = cli_open ( cli , fname , O_RDWR | O_CREAT , DENY_NONE ) ;
if ( fnum = = - 1 ) {
printf ( " Failed to create %s - %s \n " , fname , cli_errstr ( cli ) ) ;
ret = False ;
goto done ;
}
printf ( " Trying 0/0 lock \n " ) ;
io . lock . level = RAW_LOCK_LOCK ;
io . lock . in . fnum = fnum ;
io . lock . in . count = 0 ;
io . lock . in . offset = 0 ;
status = smb_raw_lock ( cli - > tree , & io ) ;
CHECK_STATUS ( status , NT_STATUS_OK ) ;
cli - > session - > pid + + ;
status = smb_raw_lock ( cli - > tree , & io ) ;
CHECK_STATUS ( status , NT_STATUS_OK ) ;
cli - > session - > pid - - ;
io . lock . level = RAW_LOCK_UNLOCK ;
status = smb_raw_lock ( cli - > tree , & io ) ;
CHECK_STATUS ( status , NT_STATUS_OK ) ;
printf ( " Trying 0/1 lock \n " ) ;
io . lock . level = RAW_LOCK_LOCK ;
io . lock . in . fnum = fnum ;
io . lock . in . count = 1 ;
io . lock . in . offset = 0 ;
status = smb_raw_lock ( cli - > tree , & io ) ;
CHECK_STATUS ( status , NT_STATUS_OK ) ;
cli - > session - > pid + + ;
status = smb_raw_lock ( cli - > tree , & io ) ;
CHECK_STATUS ( status , NT_STATUS_LOCK_NOT_GRANTED ) ;
cli - > session - > pid - - ;
io . lock . level = RAW_LOCK_UNLOCK ;
status = smb_raw_lock ( cli - > tree , & io ) ;
CHECK_STATUS ( status , NT_STATUS_OK ) ;
io . lock . level = RAW_LOCK_UNLOCK ;
status = smb_raw_lock ( cli - > tree , & io ) ;
CHECK_STATUS ( status , NT_STATUS_RANGE_NOT_LOCKED ) ;
printf ( " Trying max lock \n " ) ;
io . lock . level = RAW_LOCK_LOCK ;
io . lock . in . fnum = fnum ;
io . lock . in . count = 4000 ;
io . lock . in . offset = ~ 0 ;
status = smb_raw_lock ( cli - > tree , & io ) ;
CHECK_STATUS ( status , NT_STATUS_OK ) ;
cli - > session - > pid + + ;
status = smb_raw_lock ( cli - > tree , & io ) ;
CHECK_STATUS ( status , NT_STATUS_FILE_LOCK_CONFLICT ) ;
cli - > session - > pid - - ;
io . lock . level = RAW_LOCK_UNLOCK ;
status = smb_raw_lock ( cli - > tree , & io ) ;
CHECK_STATUS ( status , NT_STATUS_OK ) ;
io . lock . level = RAW_LOCK_UNLOCK ;
status = smb_raw_lock ( cli - > tree , & io ) ;
CHECK_STATUS ( status , NT_STATUS_RANGE_NOT_LOCKED ) ;
printf ( " Trying wrong pid unlock \n " ) ;
io . lock . level = RAW_LOCK_LOCK ;
io . lock . in . fnum = fnum ;
io . lock . in . count = 4002 ;
io . lock . in . offset = 10001 ;
status = smb_raw_lock ( cli - > tree , & io ) ;
CHECK_STATUS ( status , NT_STATUS_OK ) ;
cli - > session - > pid + + ;
io . lock . level = RAW_LOCK_UNLOCK ;
status = smb_raw_lock ( cli - > tree , & io ) ;
CHECK_STATUS ( status , NT_STATUS_RANGE_NOT_LOCKED ) ;
cli - > session - > pid - - ;
status = smb_raw_lock ( cli - > tree , & io ) ;
CHECK_STATUS ( status , NT_STATUS_OK ) ;
done :
2003-08-13 02:04:44 +00:00
cli_close ( cli , fnum ) ;
2003-08-13 01:53:07 +00:00
smb_raw_exit ( cli - > session ) ;
cli_deltree ( cli , BASEDIR ) ;
return ret ;
}
/*
test locking & X ops
*/
static BOOL test_lockx ( struct cli_state * cli , TALLOC_CTX * mem_ctx )
{
union smb_lock io ;
struct smb_lock_entry lock [ 1 ] ;
NTSTATUS status ;
BOOL ret = True ;
int fnum ;
const char * fname = BASEDIR " \\ test.txt " ;
if ( cli_deltree ( cli , BASEDIR ) = = - 1 | |
! cli_mkdir ( cli , BASEDIR ) ) {
printf ( " Unable to setup %s - %s \n " , BASEDIR , cli_errstr ( cli ) ) ;
return False ;
}
printf ( " Testing RAW_LOCK_LOCKX \n " ) ;
io . generic . level = RAW_LOCK_LOCKX ;
fnum = cli_open ( cli , fname , O_RDWR | O_CREAT , DENY_NONE ) ;
if ( fnum = = - 1 ) {
printf ( " Failed to create %s - %s \n " , fname , cli_errstr ( cli ) ) ;
ret = False ;
goto done ;
}
io . lockx . level = RAW_LOCK_LOCKX ;
io . lockx . in . fnum = fnum ;
io . lockx . in . mode = LOCKING_ANDX_LARGE_FILES ;
io . lockx . in . timeout = 0 ;
io . lockx . in . ulock_cnt = 0 ;
io . lockx . in . lock_cnt = 1 ;
lock [ 0 ] . pid = cli - > session - > pid ;
lock [ 0 ] . offset = 0 ;
lock [ 0 ] . count = 0xFFFFFFFF ;
io . lockx . in . locks = & lock [ 0 ] ;
status = smb_raw_lock ( cli - > tree , & io ) ;
CHECK_STATUS ( status , NT_STATUS_OK ) ;
done :
2003-08-13 02:04:44 +00:00
cli_close ( cli , fnum ) ;
smb_raw_exit ( cli - > session ) ;
cli_deltree ( cli , BASEDIR ) ;
return ret ;
}
/*
test high pid
*/
static BOOL test_pidhigh ( struct cli_state * cli , TALLOC_CTX * mem_ctx )
{
union smb_lock io ;
struct smb_lock_entry lock [ 1 ] ;
NTSTATUS status ;
BOOL ret = True ;
int fnum ;
const char * fname = BASEDIR " \\ test.txt " ;
char c = 1 ;
if ( cli_deltree ( cli , BASEDIR ) = = - 1 | |
! cli_mkdir ( cli , BASEDIR ) ) {
printf ( " Unable to setup %s - %s \n " , BASEDIR , cli_errstr ( cli ) ) ;
return False ;
}
printf ( " Testing high pid \n " ) ;
io . generic . level = RAW_LOCK_LOCKX ;
cli - > session - > pid = 1 ;
fnum = cli_open ( cli , fname , O_RDWR | O_CREAT , DENY_NONE ) ;
if ( fnum = = - 1 ) {
printf ( " Failed to create %s - %s \n " , fname , cli_errstr ( cli ) ) ;
ret = False ;
goto done ;
}
if ( cli_write ( cli , fnum , 0 , & c , 0 , 1 ) ! = 1 ) {
printf ( " Failed to write 1 byte - %s \n " , cli_errstr ( cli ) ) ;
ret = False ;
goto done ;
}
io . lockx . level = RAW_LOCK_LOCKX ;
io . lockx . in . fnum = fnum ;
io . lockx . in . mode = LOCKING_ANDX_LARGE_FILES ;
io . lockx . in . timeout = 0 ;
io . lockx . in . ulock_cnt = 0 ;
io . lockx . in . lock_cnt = 1 ;
lock [ 0 ] . pid = cli - > session - > pid ;
lock [ 0 ] . offset = 0 ;
lock [ 0 ] . count = 0xFFFFFFFF ;
io . lockx . in . locks = & lock [ 0 ] ;
status = smb_raw_lock ( cli - > tree , & io ) ;
CHECK_STATUS ( status , NT_STATUS_OK ) ;
if ( cli_read ( cli , fnum , & c , 0 , 1 ) ! = 1 ) {
printf ( " Failed to read 1 byte - %s \n " , cli_errstr ( cli ) ) ;
ret = False ;
goto done ;
}
cli - > session - > pid | = 0x10000 ;
cli - > session - > pid = 2 ;
if ( cli_read ( cli , fnum , & c , 0 , 1 ) = = 1 ) {
printf ( " pid is incorrect handled for read with lock! \n " ) ;
ret = False ;
goto done ;
}
cli - > session - > pid = 0x10001 ;
if ( cli_read ( cli , fnum , & c , 0 , 1 ) ! = 1 ) {
printf ( " High pid is used on this server! \n " ) ;
ret = False ;
} else {
printf ( " High pid is not used on this server (correct) \n " ) ;
}
done :
cli_close ( cli , fnum ) ;
2003-08-13 01:53:07 +00:00
smb_raw_exit ( cli - > session ) ;
cli_deltree ( cli , BASEDIR ) ;
return ret ;
}
/*
basic testing of lock calls
*/
BOOL torture_raw_lock ( int dummy )
{
struct cli_state * cli ;
BOOL ret = True ;
TALLOC_CTX * mem_ctx ;
if ( ! torture_open_connection ( & cli ) ) {
return False ;
}
mem_ctx = talloc_init ( " torture_raw_lock " ) ;
if ( ! test_lockx ( cli , mem_ctx ) ) {
ret = False ;
}
if ( ! test_lock ( cli , mem_ctx ) ) {
ret = False ;
}
2003-08-13 02:04:44 +00:00
if ( ! test_pidhigh ( cli , mem_ctx ) ) {
ret = False ;
}
2003-08-13 01:53:07 +00:00
torture_close_connection ( cli ) ;
talloc_destroy ( mem_ctx ) ;
return ret ;
}