diff options
Diffstat (limited to 'source4/torture/raw/write.c')
-rw-r--r-- | source4/torture/raw/write.c | 255 |
1 files changed, 5 insertions, 250 deletions
diff --git a/source4/torture/raw/write.c b/source4/torture/raw/write.c index 585e231cac..7def976b46 100644 --- a/source4/torture/raw/write.c +++ b/source4/torture/raw/write.c @@ -1,6 +1,7 @@ /* Unix SMB/CIFS implementation. test suite for various write operations + Copyright (C) Andrew Tridgell 2003 This program is free software; you can redistribute it and/or modify @@ -60,18 +61,6 @@ #define BASEDIR "\\testwrite" -static BOOL setup_dir(struct smbcli_state *cli, const char *dname) -{ - smb_raw_exit(cli->session); - if (smbcli_deltree(cli->tree, dname) == -1 || - NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, dname))) { - printf("Unable to setup %s - %s\n", dname, smbcli_errstr(cli->tree)); - return False; - } - return True; -} - - /* setup a random buffer based on a seed */ @@ -117,7 +106,7 @@ static BOOL test_write(struct smbcli_state *cli, TALLOC_CTX *mem_ctx) buf = talloc_zero(mem_ctx, maxsize); - if (!setup_dir(cli, BASEDIR)) { + if (!torture_setup_dir(cli, BASEDIR)) { return False; } @@ -234,7 +223,7 @@ static BOOL test_writex(struct smbcli_state *cli, TALLOC_CTX *mem_ctx) buf = talloc_zero(mem_ctx, maxsize); - if (!setup_dir(cli, BASEDIR)) { + if (!torture_setup_dir(cli, BASEDIR)) { return False; } @@ -410,7 +399,7 @@ static BOOL test_writeunlock(struct smbcli_state *cli, TALLOC_CTX *mem_ctx) buf = talloc_zero(mem_ctx, maxsize); - if (!setup_dir(cli, BASEDIR)) { + if (!torture_setup_dir(cli, BASEDIR)) { return False; } @@ -547,7 +536,7 @@ static BOOL test_writeclose(struct smbcli_state *cli, TALLOC_CTX *mem_ctx) buf = talloc_zero(mem_ctx, maxsize); - if (!setup_dir(cli, BASEDIR)) { + if (!torture_setup_dir(cli, BASEDIR)) { return False; } @@ -680,238 +669,6 @@ done: return ret; } -static BOOL test_delayed_write_update(struct smbcli_state *cli, TALLOC_CTX *mem_ctx) -{ - union smb_fileinfo finfo1, finfo2; - const char *fname = BASEDIR "\\torture_file.txt"; - NTSTATUS status; - int fnum1 = -1; - BOOL ret = True; - ssize_t written; - time_t t; - - printf("Testing delayed update of write time\n"); - - if (!setup_dir(cli, BASEDIR)) { - return False; - } - - fnum1 = smbcli_open(cli->tree, fname, O_RDWR|O_CREAT, DENY_NONE); - if (fnum1 == -1) { - printf("Failed to open %s\n", fname); - return False; - } - - finfo1.basic_info.level = RAW_FILEINFO_BASIC_INFO; - finfo1.basic_info.in.fnum = fnum1; - finfo2 = finfo1; - - status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo1); - - if (!NT_STATUS_IS_OK(status)) { - DEBUG(0, ("fileinfo failed: %s\n", nt_errstr(status))); - return False; - } - - printf("Initial write time %s\n", - nt_time_string(mem_ctx, finfo1.basic_info.out.write_time)); - - /* 3 second delay to ensure we get past any 2 second time - granularity (older systems may have that) */ - sleep(3); - - written = smbcli_write(cli->tree, fnum1, 0, "x", 0, 1); - - if (written != 1) { - printf("write failed - wrote %d bytes (%s)\n", written, __location__); - return False; - } - - t = time(NULL); - - while (time(NULL) < t+120) { - status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo2); - - if (!NT_STATUS_IS_OK(status)) { - DEBUG(0, ("fileinfo failed: %s\n", nt_errstr(status))); - ret = False; - break; - } - printf("write time %s\n", - nt_time_string(mem_ctx, finfo2.basic_info.out.write_time)); - if (finfo1.basic_info.out.write_time != finfo2.basic_info.out.write_time) { - printf("Server updated write_time after %d seconds\n", - (int)(time(NULL) - t)); - break; - } - sleep(1); - fflush(stdout); - } - - if (finfo1.basic_info.out.write_time == finfo2.basic_info.out.write_time) { - printf("Server did not update write time?!\n"); - ret = False; - } - - - if (fnum1 != -1) - smbcli_close(cli->tree, fnum1); - smbcli_unlink(cli->tree, fname); - smbcli_deltree(cli->tree, BASEDIR); - - return ret; -} - - -/* Windows does obviously not update the stat info during a write call. I - * *think* this is the problem causing a spurious Excel 2003 on XP error - * message when saving a file. Excel does a setfileinfo, writes, and then does - * a getpath(!)info. Or so... For Samba sometimes it displays an error message - * that the file might have been changed in between. What i've been able to - * trace down is that this happens if the getpathinfo after the write shows a - * different last write time than the setfileinfo showed. This is really - * nasty.... - */ - -static BOOL test_finfo_after_write(struct smbcli_state *cli, TALLOC_CTX *mem_ctx) -{ - union smb_fileinfo finfo1, finfo2; - const char *fname = BASEDIR "\\torture_file.txt"; - NTSTATUS status; - int fnum1 = -1; - int fnum2; - BOOL ret = True; - ssize_t written; - struct smbcli_state *cli2=NULL; - - printf("Testing finfo update on close\n"); - - if (!setup_dir(cli, BASEDIR)) { - return False; - } - - fnum1 = smbcli_open(cli->tree, fname, O_RDWR|O_CREAT, DENY_NONE); - if (fnum1 == -1) { - ret = False; - goto done; - } - - finfo1.basic_info.level = RAW_FILEINFO_BASIC_INFO; - finfo1.basic_info.in.fnum = fnum1; - - status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo1); - - if (!NT_STATUS_IS_OK(status)) { - DEBUG(0, ("fileinfo failed: %s\n", nt_errstr(status))); - ret = False; - goto done; - } - - msleep(1000); - - written = smbcli_write(cli->tree, fnum1, 0, "x", 0, 1); - - if (written != 1) { - printf("(%s) written gave %d - should have been 1\n", - __location__, written); - ret = False; - goto done; - } - - if (!torture_open_connection(&cli2)) { - return False; - } - - fnum2 = smbcli_open(cli2->tree, fname, O_RDWR, DENY_NONE); - if (fnum2 == -1) { - printf("(%s) failed to open 2nd time - %s\n", - __location__, smbcli_errstr(cli2->tree)); - ret = False; - goto done; - } - - written = smbcli_write(cli2->tree, fnum2, 0, "x", 0, 1); - - if (written != 1) { - printf("(%s) written gave %d - should have been 1\n", - __location__, written); - ret = False; - goto done; - } - - finfo2.basic_info.level = RAW_FILEINFO_BASIC_INFO; - finfo2.basic_info.in.fname = fname; - - status = smb_raw_pathinfo(cli2->tree, mem_ctx, &finfo2); - - if (!NT_STATUS_IS_OK(status)) { - DEBUG(0, ("(%s) fileinfo failed: %s\n", - __location__, nt_errstr(status))); - ret = False; - goto done; - } - - if (finfo1.basic_info.out.create_time != - finfo2.basic_info.out.create_time) { - printf("(%s) create_time changed\n", __location__); - ret = False; - goto done; - } - - if (finfo1.basic_info.out.access_time != - finfo2.basic_info.out.access_time) { - printf("(%s) access_time changed\n", __location__); - ret = False; - goto done; - } - - if (finfo1.basic_info.out.write_time != - finfo2.basic_info.out.write_time) { - printf("(%s) write_time changed\n", __location__); - ret = False; - goto done; - } - - if (finfo1.basic_info.out.change_time != - finfo2.basic_info.out.change_time) { - printf("(%s) change_time changed\n", __location__); - ret = False; - goto done; - } - - /* One of the two following calls updates the qpathinfo. */ - - /* If you had skipped the smbcli_write on fnum2, it would - * *not* have updated the stat on disk */ - - smbcli_close(cli2->tree, fnum2); - torture_close_connection(cli2); - cli2 = NULL; - - /* This call is only for the people looking at ethereal :-) */ - finfo2.basic_info.level = RAW_FILEINFO_BASIC_INFO; - finfo2.basic_info.in.fname = fname; - - status = smb_raw_pathinfo(cli->tree, mem_ctx, &finfo2); - - if (!NT_STATUS_IS_OK(status)) { - DEBUG(0, ("fileinfo failed: %s\n", nt_errstr(status))); - ret = False; - goto done; - } - - done: - if (fnum1 != -1) - smbcli_close(cli->tree, fnum1); - smbcli_unlink(cli->tree, fname); - smbcli_deltree(cli->tree, BASEDIR); - if (cli2 != NULL) { - torture_close_connection(cli2); - } - - return ret; -} - /* basic testing of write calls */ @@ -927,8 +684,6 @@ BOOL torture_raw_write(void) mem_ctx = talloc_init("torture_raw_write"); - ret &= test_finfo_after_write(cli, mem_ctx); - ret &= test_delayed_write_update(cli, mem_ctx); ret &= test_write(cli, mem_ctx); ret &= test_writeunlock(cli, mem_ctx); ret &= test_writeclose(cli, mem_ctx); |