summaryrefslogtreecommitdiff
path: root/source4/torture
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2003-08-13 16:04:21 +0000
committerAndrew Tridgell <tridge@samba.org>2003-08-13 16:04:21 +0000
commit75c0125fb71b0562e7bdd85c391764796b5f12f6 (patch)
treeb589d2e6bbc2c517a3f79790d0ed309ef79f7507 /source4/torture
parenta3b86fe170beb70ffab8585a276ca1648fffd454 (diff)
downloadsamba-75c0125fb71b0562e7bdd85c391764796b5f12f6.tar.gz
samba-75c0125fb71b0562e7bdd85c391764796b5f12f6.tar.bz2
samba-75c0125fb71b0562e7bdd85c391764796b5f12f6.zip
- added SMBntrename test suite
- allow username of form DOMAIN\username or DOMAIN/username - added ntrename to gentest (This used to be commit 2b464472c17b791eb5b117f89d5aaea2bf60f6ad)
Diffstat (limited to 'source4/torture')
-rw-r--r--source4/torture/gentest.c43
-rw-r--r--source4/torture/raw/missing.txt1
-rw-r--r--source4/torture/raw/rename.c208
-rw-r--r--source4/torture/torture.c46
4 files changed, 260 insertions, 38 deletions
diff --git a/source4/torture/gentest.c b/source4/torture/gentest.c
index 3519b51f14..72b8e8d404 100644
--- a/source4/torture/gentest.c
+++ b/source4/torture/gentest.c
@@ -470,6 +470,18 @@ static BOOL gen_bool(void)
}
/*
+ generate ntrename flags
+*/
+static uint16 gen_rename_flags(void)
+{
+ if (gen_chance(30)) return RENAME_FLAG_RENAME;
+ if (gen_chance(30)) return RENAME_FLAG_HARD_LINK;
+ if (gen_chance(30)) return RENAME_FLAG_COPY;
+ return gen_bits_mask(0xFFFF);
+}
+
+
+/*
return a lockingx lock mode
*/
static uint16 gen_lock_mode(void)
@@ -1218,12 +1230,34 @@ static BOOL handler_rmdir(int instance)
*/
static BOOL handler_rename(int instance)
{
- struct smb_rename parm[NSERVERS];
+ union smb_rename parm[NSERVERS];
NTSTATUS status[NSERVERS];
- parm[0].in.pattern1 = gen_pattern();
- parm[0].in.pattern2 = gen_pattern();
- parm[0].in.attrib = gen_attrib();
+ parm[0].generic.level = RAW_RENAME_RENAME;
+ parm[0].rename.in.pattern1 = gen_pattern();
+ parm[0].rename.in.pattern2 = gen_pattern();
+ parm[0].rename.in.attrib = gen_attrib();
+
+ GEN_COPY_PARM;
+ GEN_CALL(smb_raw_rename(tree, &parm[i]));
+
+ return True;
+}
+
+/*
+ generate ntrename operations
+*/
+static BOOL handler_ntrename(int instance)
+{
+ union smb_rename parm[NSERVERS];
+ NTSTATUS status[NSERVERS];
+
+ parm[0].generic.level = RAW_RENAME_NTRENAME;
+ parm[0].ntrename.in.old_name = gen_fname();
+ parm[0].ntrename.in.new_name = gen_fname();
+ parm[0].ntrename.in.attrib = gen_attrib();
+ parm[0].ntrename.in.root_fid = gen_root_fid(instance);
+ parm[0].ntrename.in.flags = gen_rename_flags();
GEN_COPY_PARM;
GEN_CALL(smb_raw_rename(tree, &parm[i]));
@@ -1771,6 +1805,7 @@ static struct {
{"MKDIR", handler_mkdir},
{"RMDIR", handler_rmdir},
{"RENAME", handler_rename},
+ {"NTRENAME", handler_ntrename},
{"READX", handler_readx},
{"WRITEX", handler_writex},
{"CHKPATH", handler_chkpath},
diff --git a/source4/torture/raw/missing.txt b/source4/torture/raw/missing.txt
index 8e026b78ff..9a33e7ed6f 100644
--- a/source4/torture/raw/missing.txt
+++ b/source4/torture/raw/missing.txt
@@ -92,6 +92,7 @@ trans2_setfileinfo
trans2_fsctl
trans2_mkdir
trans2_findnext
+NTrename
SMB_QFS_ALLOCATION
SMB_QFS_VOLUME
SMB_QFS_VOLUME_INFO
diff --git a/source4/torture/raw/rename.c b/source4/torture/raw/rename.c
index 4cfa1c95c2..0e411299d0 100644
--- a/source4/torture/raw/rename.c
+++ b/source4/torture/raw/rename.c
@@ -28,6 +28,13 @@
goto done; \
}} while (0)
+#define CHECK_VALUE(v, correct) do { \
+ if ((v) != (correct)) { \
+ printf("(%d) Incorrect %s %d - should be %d\n", \
+ __LINE__, #v, (int)v, (int)correct); \
+ ret = False; \
+ }} while (0)
+
#define BASEDIR "\\testrename"
/*
@@ -35,13 +42,15 @@
*/
static BOOL test_mv(struct cli_state *cli, TALLOC_CTX *mem_ctx)
{
- struct smb_rename io;
+ union smb_rename io;
NTSTATUS status;
BOOL ret = True;
int fnum;
const char *fname1 = BASEDIR "\\test1.txt";
const char *fname2 = BASEDIR "\\test2.txt";
+ printf("Testing SMBmv\n");
+
if (cli_deltree(cli, BASEDIR) == -1 ||
!cli_mkdir(cli, BASEDIR)) {
printf("Unable to setup %s - %s\n", BASEDIR, cli_errstr(cli));
@@ -52,9 +61,10 @@ static BOOL test_mv(struct cli_state *cli, TALLOC_CTX *mem_ctx)
fnum = create_complex_file(cli, mem_ctx, fname1);
- io.in.pattern1 = fname1;
- io.in.pattern2 = fname2;
- io.in.attrib = 0;
+ io.generic.level = RAW_RENAME_RENAME;
+ io.rename.in.pattern1 = fname1;
+ io.rename.in.pattern2 = fname2;
+ io.rename.in.attrib = 0;
status = smb_raw_rename(cli->tree, &io);
CHECK_STATUS(status, NT_STATUS_SHARING_VIOLATION);
@@ -62,11 +72,22 @@ static BOOL test_mv(struct cli_state *cli, TALLOC_CTX *mem_ctx)
smb_raw_exit(cli->session);
status = smb_raw_rename(cli->tree, &io);
CHECK_STATUS(status, NT_STATUS_OK);
+
+ printf("Trying self rename\n");
+ io.rename.in.pattern1 = fname2;
+ io.rename.in.pattern2 = fname2;
+ status = smb_raw_rename(cli->tree, &io);
+ CHECK_STATUS(status, NT_STATUS_OK);
+
+ io.rename.in.pattern1 = fname1;
+ io.rename.in.pattern2 = fname1;
+ status = smb_raw_rename(cli->tree, &io);
+ CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_NOT_FOUND);
printf("trying wildcard rename\n");
- io.in.pattern1 = BASEDIR "\\*.txt";
- io.in.pattern2 = fname1;
+ io.rename.in.pattern1 = BASEDIR "\\*.txt";
+ io.rename.in.pattern2 = fname1;
status = smb_raw_rename(cli->tree, &io);
CHECK_STATUS(status, NT_STATUS_OK);
@@ -76,8 +97,8 @@ static BOOL test_mv(struct cli_state *cli, TALLOC_CTX *mem_ctx)
CHECK_STATUS(status, NT_STATUS_OK);
printf("Trying extension change\n");
- io.in.pattern1 = BASEDIR "\\*.txt";
- io.in.pattern2 = BASEDIR "\\*.bak";
+ io.rename.in.pattern1 = BASEDIR "\\*.txt";
+ io.rename.in.pattern2 = BASEDIR "\\*.bak";
status = smb_raw_rename(cli->tree, &io);
CHECK_STATUS(status, NT_STATUS_OK);
@@ -86,13 +107,13 @@ static BOOL test_mv(struct cli_state *cli, TALLOC_CTX *mem_ctx)
printf("Checking attrib handling\n");
torture_set_file_attribute(cli->tree, BASEDIR "\\test1.bak", FILE_ATTRIBUTE_HIDDEN);
- io.in.pattern1 = BASEDIR "\\test1.bak";
- io.in.pattern2 = BASEDIR "\\*.txt";
- io.in.attrib = 0;
+ io.rename.in.pattern1 = BASEDIR "\\test1.bak";
+ io.rename.in.pattern2 = BASEDIR "\\*.txt";
+ io.rename.in.attrib = 0;
status = smb_raw_rename(cli->tree, &io);
CHECK_STATUS(status, NT_STATUS_NO_SUCH_FILE);
- io.in.attrib = FILE_ATTRIBUTE_HIDDEN;
+ io.rename.in.attrib = FILE_ATTRIBUTE_HIDDEN;
status = smb_raw_rename(cli->tree, &io);
CHECK_STATUS(status, NT_STATUS_OK);
@@ -103,6 +124,165 @@ done:
}
+
+/*
+ test SMBntrename ops
+*/
+static BOOL test_ntrename(struct cli_state *cli, TALLOC_CTX *mem_ctx)
+{
+ union smb_rename io;
+ NTSTATUS status;
+ BOOL ret = True;
+ int fnum;
+ const char *fname1 = BASEDIR "\\test1.txt";
+ const char *fname2 = BASEDIR "\\test2.txt";
+ union smb_fileinfo finfo;
+
+ printf("Testing SMBntrename\n");
+
+ if (cli_deltree(cli, BASEDIR) == -1 ||
+ !cli_mkdir(cli, BASEDIR)) {
+ printf("Unable to setup %s - %s\n", BASEDIR, cli_errstr(cli));
+ return False;
+ }
+
+ printf("Trying simple rename\n");
+
+ fnum = create_complex_file(cli, mem_ctx, fname1);
+
+ io.generic.level = RAW_RENAME_NTRENAME;
+ io.ntrename.in.old_name = fname1;
+ io.ntrename.in.new_name = fname2;
+ io.ntrename.in.attrib = 0;
+ io.ntrename.in.root_fid = 0;
+ io.ntrename.in.flags = RENAME_FLAG_RENAME;
+
+ status = smb_raw_rename(cli->tree, &io);
+ CHECK_STATUS(status, NT_STATUS_SHARING_VIOLATION);
+
+ smb_raw_exit(cli->session);
+ status = smb_raw_rename(cli->tree, &io);
+ CHECK_STATUS(status, NT_STATUS_OK);
+
+ printf("Trying self rename\n");
+ io.ntrename.in.old_name = fname2;
+ io.ntrename.in.new_name = fname2;
+ status = smb_raw_rename(cli->tree, &io);
+ CHECK_STATUS(status, NT_STATUS_OK);
+
+ io.ntrename.in.old_name = fname1;
+ io.ntrename.in.new_name = fname1;
+ status = smb_raw_rename(cli->tree, &io);
+ CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_NOT_FOUND);
+
+ printf("trying wildcard rename\n");
+ io.ntrename.in.old_name = BASEDIR "\\*.txt";
+ io.ntrename.in.new_name = fname1;
+
+ status = smb_raw_rename(cli->tree, &io);
+ CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_SYNTAX_BAD);
+
+ printf("Checking attrib handling\n");
+ torture_set_file_attribute(cli->tree, fname2, FILE_ATTRIBUTE_HIDDEN);
+ io.ntrename.in.old_name = fname2;
+ io.ntrename.in.new_name = fname1;
+ io.ntrename.in.attrib = 0;
+ status = smb_raw_rename(cli->tree, &io);
+ CHECK_STATUS(status, NT_STATUS_NO_SUCH_FILE);
+
+ io.ntrename.in.attrib = FILE_ATTRIBUTE_HIDDEN;
+ status = smb_raw_rename(cli->tree, &io);
+ CHECK_STATUS(status, NT_STATUS_OK);
+
+ torture_set_file_attribute(cli->tree, fname1, FILE_ATTRIBUTE_NORMAL);
+
+ printf("Checking hard link\n");
+ io.ntrename.in.old_name = fname1;
+ io.ntrename.in.new_name = fname2;
+ io.ntrename.in.attrib = 0;
+ io.ntrename.in.flags = RENAME_FLAG_HARD_LINK;
+ status = smb_raw_rename(cli->tree, &io);
+ CHECK_STATUS(status, NT_STATUS_OK);
+
+ torture_set_file_attribute(cli->tree, fname1, FILE_ATTRIBUTE_SYSTEM);
+
+ finfo.generic.level = RAW_FILEINFO_ALL_INFO;
+ finfo.generic.in.fname = fname2;
+ status = smb_raw_pathinfo(cli->tree, mem_ctx, &finfo);
+ CHECK_STATUS(status, NT_STATUS_OK);
+ CHECK_VALUE(finfo.all_info.out.nlink, 2);
+ CHECK_VALUE(finfo.all_info.out.attrib, FILE_ATTRIBUTE_SYSTEM);
+
+ finfo.generic.in.fname = fname1;
+ status = smb_raw_pathinfo(cli->tree, mem_ctx, &finfo);
+ CHECK_STATUS(status, NT_STATUS_OK);
+ CHECK_VALUE(finfo.all_info.out.nlink, 2);
+ CHECK_VALUE(finfo.all_info.out.attrib, FILE_ATTRIBUTE_SYSTEM);
+
+ torture_set_file_attribute(cli->tree, fname1, FILE_ATTRIBUTE_NORMAL);
+
+ cli_unlink(cli, fname2);
+
+ finfo.generic.in.fname = fname1;
+ status = smb_raw_pathinfo(cli->tree, mem_ctx, &finfo);
+ CHECK_STATUS(status, NT_STATUS_OK);
+ CHECK_VALUE(finfo.all_info.out.nlink, 1);
+
+ printf("Checking copy\n");
+ io.ntrename.in.old_name = fname1;
+ io.ntrename.in.new_name = fname2;
+ io.ntrename.in.attrib = 0;
+ io.ntrename.in.flags = RENAME_FLAG_COPY;
+ status = smb_raw_rename(cli->tree, &io);
+ CHECK_STATUS(status, NT_STATUS_OK);
+
+ torture_set_file_attribute(cli->tree, fname1, FILE_ATTRIBUTE_SYSTEM);
+
+ finfo.generic.level = RAW_FILEINFO_ALL_INFO;
+ finfo.generic.in.fname = fname2;
+ status = smb_raw_pathinfo(cli->tree, mem_ctx, &finfo);
+ CHECK_STATUS(status, NT_STATUS_OK);
+ CHECK_VALUE(finfo.all_info.out.nlink, 1);
+ CHECK_VALUE(finfo.all_info.out.attrib, FILE_ATTRIBUTE_NORMAL);
+
+ finfo.generic.in.fname = fname1;
+ status = smb_raw_pathinfo(cli->tree, mem_ctx, &finfo);
+ CHECK_STATUS(status, NT_STATUS_OK);
+ CHECK_VALUE(finfo.all_info.out.nlink, 1);
+ CHECK_VALUE(finfo.all_info.out.attrib, FILE_ATTRIBUTE_SYSTEM);
+
+ torture_set_file_attribute(cli->tree, fname1, FILE_ATTRIBUTE_NORMAL);
+
+ cli_unlink(cli, fname2);
+
+ finfo.generic.in.fname = fname1;
+ status = smb_raw_pathinfo(cli->tree, mem_ctx, &finfo);
+ CHECK_STATUS(status, NT_STATUS_OK);
+ CHECK_VALUE(finfo.all_info.out.nlink, 1);
+
+ printf("Checking invalid flags\n");
+ io.ntrename.in.old_name = fname1;
+ io.ntrename.in.new_name = fname2;
+ io.ntrename.in.attrib = 0;
+ io.ntrename.in.flags = 0;
+ status = smb_raw_rename(cli->tree, &io);
+ CHECK_STATUS(status, NT_STATUS_ACCESS_DENIED);
+
+ io.ntrename.in.flags = 300;
+ status = smb_raw_rename(cli->tree, &io);
+ CHECK_STATUS(status, NT_STATUS_ACCESS_DENIED);
+
+ io.ntrename.in.flags = 0x106;
+ status = smb_raw_rename(cli->tree, &io);
+ CHECK_STATUS(status, NT_STATUS_ACCESS_DENIED);
+
+done:
+ smb_raw_exit(cli->session);
+ cli_deltree(cli, BASEDIR);
+ return ret;
+}
+
+
/*
basic testing of rename calls
*/
@@ -122,6 +302,10 @@ BOOL torture_raw_rename(int dummy)
ret = False;
}
+ if (!test_ntrename(cli, mem_ctx)) {
+ ret = False;
+ }
+
torture_close_connection(cli);
talloc_destroy(mem_ctx);
return ret;
diff --git a/source4/torture/torture.c b/source4/torture/torture.c
index 05a2979dd1..a43db896e0 100644
--- a/source4/torture/torture.c
+++ b/source4/torture/torture.c
@@ -106,6 +106,7 @@ BOOL torture_open_connection(struct cli_state **c)
username, lp_workgroup(),
password, flags, &retry);
if (!NT_STATUS_IS_OK(status)) {
+ printf("Failed to open connection - %s\n", nt_errstr(status));
return False;
}
@@ -3986,6 +3987,25 @@ static BOOL run_test(const char *name)
}
+/*
+ parse a username%password
+*/
+static void parse_user(const char *user)
+{
+ char *username, *password, *p;
+
+ username = strdup(user);
+ p = strchr_m(username,'%');
+ if (p) {
+ *p = 0;
+ password = strdup(p+1);
+ }
+
+ lp_set_cmdline("torture:username", username);
+ lp_set_cmdline("torture:password", password);
+}
+
+
static void usage(void)
{
int i;
@@ -4030,9 +4050,8 @@ static void usage(void)
int opt, i;
char *p;
int gotuser = 0;
- int gotpass = 0;
BOOL correct = True;
- char *host, *share, *username, *password;
+ char *host, *share, *username;
setup_logging("smbtorture", DEBUG_STDOUT);
@@ -4129,15 +4148,7 @@ static void usage(void)
break;
case 'U':
gotuser = 1;
- username = strdup(optarg);
- p = strchr_m(username,'%');
- if (p) {
- *p = 0;
- password = strdup(p+1);
- gotpass = 1;
- }
- lp_set_cmdline("torture:username", username);
- lp_set_cmdline("torture:password", password);
+ parse_user(optarg);
break;
case 'f':
torture_failures = atoi(optarg);
@@ -4152,18 +4163,9 @@ static void usage(void)
}
}
- if(use_kerberos && !gotuser) gotpass = True;
-
- while (!gotpass) {
- p = getpass("Password:");
- if (p) {
- lp_set_cmdline("torture:password", p);
- gotpass = 1;
- }
- }
-
printf("host=%s share=%s user=%s myname=%s\n",
- host, share, username, lp_netbios_name());
+ host, share, lp_parm_string(-1, "torture", "username"),
+ lp_netbios_name());
if (argc == optind) {
printf("You must specify a test to run, or 'ALL'\n");