2003-08-13 01:53:07 +00:00
/*
Unix SMB / CIFS implementation .
RAW_MKDIR_ * and RAW_RMDIR_ * individual test suite
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
2007-07-10 02:07:03 +00:00
the Free Software Foundation ; either version 3 of the License , or
2003-08-13 01:53:07 +00: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 02:07:03 +00:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2003-08-13 01:53:07 +00:00
*/
# include "includes.h"
2006-01-03 13:41:17 +00:00
# include "torture/torture.h"
2005-12-28 15:38:36 +00:00
# include "libcli/raw/libcliraw.h"
2006-01-03 15:40:05 +00:00
# include "libcli/libcli.h"
2006-03-17 17:59:58 +00:00
# include "torture/util.h"
2007-09-08 12:42:09 +00:00
# include "param/param.h"
2003-08-13 01:53:07 +00:00
2004-12-13 23:58:39 +00:00
# define BASEDIR "\\mkdirtest"
2003-08-13 01:53:07 +00:00
# define CHECK_STATUS(status, correct) do { \
if ( ! NT_STATUS_EQUAL ( status , correct ) ) { \
2004-10-25 06:23:28 +00:00
printf ( " (%s) Incorrect status %s - should be %s \n " , \
__location__ , nt_errstr ( status ) , nt_errstr ( correct ) ) ; \
2003-08-13 01:53:07 +00:00
ret = False ; \
goto done ; \
} } while ( 0 )
/*
test mkdir ops
*/
2004-08-04 13:23:35 +00:00
static BOOL test_mkdir ( struct smbcli_state * cli , TALLOC_CTX * mem_ctx )
2003-08-13 01:53:07 +00:00
{
union smb_mkdir md ;
struct smb_rmdir rd ;
2004-12-13 23:58:39 +00:00
const char * path = BASEDIR " \\ mkdir.dir " ;
2003-08-13 01:53:07 +00:00
NTSTATUS status ;
BOOL ret = True ;
2004-12-13 23:58:39 +00:00
if ( ! torture_setup_dir ( cli , BASEDIR ) ) {
return False ;
}
2003-08-13 01:53:07 +00:00
/*
basic mkdir
*/
md . mkdir . level = RAW_MKDIR_MKDIR ;
md . mkdir . in . path = path ;
status = smb_raw_mkdir ( cli - > tree , & md ) ;
CHECK_STATUS ( status , NT_STATUS_OK ) ;
printf ( " testing mkdir collision \n " ) ;
/* 2nd create */
status = smb_raw_mkdir ( cli - > tree , & md ) ;
CHECK_STATUS ( status , NT_STATUS_OBJECT_NAME_COLLISION ) ;
/* basic rmdir */
rd . in . path = path ;
status = smb_raw_rmdir ( cli - > tree , & rd ) ;
CHECK_STATUS ( status , NT_STATUS_OK ) ;
status = smb_raw_rmdir ( cli - > tree , & rd ) ;
CHECK_STATUS ( status , NT_STATUS_OBJECT_NAME_NOT_FOUND ) ;
printf ( " testing mkdir collision with file \n " ) ;
/* name collision with a file */
2004-08-04 13:23:35 +00:00
smbcli_close ( cli - > tree , create_complex_file ( cli , mem_ctx , path ) ) ;
2003-08-13 01:53:07 +00:00
status = smb_raw_mkdir ( cli - > tree , & md ) ;
CHECK_STATUS ( status , NT_STATUS_OBJECT_NAME_COLLISION ) ;
printf ( " testing rmdir with file \n " ) ;
/* delete a file with rmdir */
status = smb_raw_rmdir ( cli - > tree , & rd ) ;
CHECK_STATUS ( status , NT_STATUS_NOT_A_DIRECTORY ) ;
2004-08-04 13:23:35 +00:00
smbcli_unlink ( cli - > tree , path ) ;
2003-08-13 01:53:07 +00:00
printf ( " testing invalid dir \n " ) ;
/* create an invalid dir */
md . mkdir . in . path = " .. \\ .. \\ .. " ;
status = smb_raw_mkdir ( cli - > tree , & md ) ;
CHECK_STATUS ( status , NT_STATUS_OBJECT_PATH_SYNTAX_BAD ) ;
printf ( " testing t2mkdir \n " ) ;
/* try a t2mkdir - need to work out why this fails! */
md . t2mkdir . level = RAW_MKDIR_T2MKDIR ;
md . t2mkdir . in . path = path ;
md . t2mkdir . in . num_eas = 0 ;
status = smb_raw_mkdir ( cli - > tree , & md ) ;
2004-12-13 23:58:39 +00:00
CHECK_STATUS ( status , NT_STATUS_OK ) ;
status = smb_raw_rmdir ( cli - > tree , & rd ) ;
CHECK_STATUS ( status , NT_STATUS_OK ) ;
2003-08-13 01:53:07 +00:00
2006-12-21 22:16:16 +00:00
printf ( " testing t2mkdir bad path \n " ) ;
md . t2mkdir . in . path = talloc_asprintf ( mem_ctx , " %s \\ bad_path \\ bad_path " ,
BASEDIR ) ;
status = smb_raw_mkdir ( cli - > tree , & md ) ;
CHECK_STATUS ( status , NT_STATUS_OBJECT_PATH_NOT_FOUND ) ;
2003-08-13 01:53:07 +00:00
printf ( " testing t2mkdir with EAs \n " ) ;
/* with EAs */
2004-12-13 23:58:39 +00:00
md . t2mkdir . level = RAW_MKDIR_T2MKDIR ;
md . t2mkdir . in . path = path ;
md . t2mkdir . in . num_eas = 3 ;
2005-01-27 07:08:20 +00:00
md . t2mkdir . in . eas = talloc_array ( mem_ctx , struct ea_struct , md . t2mkdir . in . num_eas ) ;
2003-08-13 01:53:07 +00:00
md . t2mkdir . in . eas [ 0 ] . flags = 0 ;
md . t2mkdir . in . eas [ 0 ] . name . s = " EAONE " ;
2004-12-13 23:58:39 +00:00
md . t2mkdir . in . eas [ 0 ] . value = data_blob_talloc ( mem_ctx , " blah " , 4 ) ;
md . t2mkdir . in . eas [ 1 ] . flags = 0 ;
md . t2mkdir . in . eas [ 1 ] . name . s = " EA TWO " ;
md . t2mkdir . in . eas [ 1 ] . value = data_blob_talloc ( mem_ctx , " foo bar " , 7 ) ;
md . t2mkdir . in . eas [ 2 ] . flags = 0 ;
md . t2mkdir . in . eas [ 2 ] . name . s = " EATHREE " ;
md . t2mkdir . in . eas [ 2 ] . value = data_blob_talloc ( mem_ctx , " xx1 " , 3 ) ;
2003-08-13 01:53:07 +00:00
status = smb_raw_mkdir ( cli - > tree , & md ) ;
2004-12-13 23:58:39 +00:00
2006-12-21 21:15:59 +00:00
if ( lp_parm_bool ( - 1 , " torture " , " samba3 " , False )
& & NT_STATUS_EQUAL ( status , NT_STATUS_EAS_NOT_SUPPORTED ) ) {
d_printf ( " EAS not supported -- not treating as fatal \n " ) ;
}
else {
/*
* In Samba3 , don ' t see this error as fatal
*/
CHECK_STATUS ( status , NT_STATUS_OK ) ;
status = torture_check_ea ( cli , path , " EAONE " , " blah " ) ;
CHECK_STATUS ( status , NT_STATUS_OK ) ;
status = torture_check_ea ( cli , path , " EA TWO " , " foo bar " ) ;
CHECK_STATUS ( status , NT_STATUS_OK ) ;
status = torture_check_ea ( cli , path , " EATHREE " , " xx1 " ) ;
CHECK_STATUS ( status , NT_STATUS_OK ) ;
status = smb_raw_rmdir ( cli - > tree , & rd ) ;
CHECK_STATUS ( status , NT_STATUS_OK ) ;
}
2003-08-13 01:53:07 +00:00
done :
2004-12-13 23:58:39 +00:00
smb_raw_exit ( cli - > session ) ;
smbcli_deltree ( cli - > tree , BASEDIR ) ;
2003-08-13 01:53:07 +00:00
return ret ;
}
/*
basic testing of all RAW_MKDIR_ * calls
*/
2007-09-07 15:08:14 +00:00
bool torture_raw_mkdir ( struct torture_context * torture ,
struct smbcli_state * cli )
2003-08-13 01:53:07 +00:00
{
2007-08-28 12:54:27 +00:00
bool ret = true ;
2003-08-13 01:53:07 +00:00
2007-08-28 12:54:27 +00:00
if ( ! test_mkdir ( cli , torture ) ) {
ret = false ;
2003-08-13 01:53:07 +00:00
}
return ret ;
}