diff options
Diffstat (limited to 'source4/torture/rpc')
-rw-r--r-- | source4/torture/rpc/dfs.c | 91 |
1 files changed, 90 insertions, 1 deletions
diff --git a/source4/torture/rpc/dfs.c b/source4/torture/rpc/dfs.c index ad496bc742..77de4017d4 100644 --- a/source4/torture/rpc/dfs.c +++ b/source4/torture/rpc/dfs.c @@ -41,6 +41,43 @@ static BOOL test_Exist(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) return True; } +static BOOL test_InfoLevel(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, uint16 level, + const char *root) +{ + NTSTATUS status; + struct dfs_GetInfo r; + + r.in.path = root; + r.in.server = NULL; + r.in.share = NULL; + r.in.level = level; + + printf("Testing GetInfo level %u on '%s'\n", level, root); + + status = dcerpc_dfs_GetInfo(p, mem_ctx, &r); + if (!NT_STATUS_IS_OK(status)) { + printf("Info failed - %s\n", nt_errstr(status)); + return False; + } + + NDR_PRINT_UNION_DEBUG(dfs_Info, r.in.level, &r.out.info); + + return True; +} + +static BOOL test_Info(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const char *root) +{ + BOOL ret = True; + uint16 levels[] = {1, 2, 3, 4, 100, 101, 102, 200, 300}; + int i; + for (i=0;i<ARRAY_SIZE(levels);i++) { + if (!test_InfoLevel(p, mem_ctx, levels[i], root)) { + ret = False; + } + } + return ret; +} + static BOOL test_EnumLevel(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, uint16 level) { NTSTATUS status; @@ -49,6 +86,7 @@ static BOOL test_EnumLevel(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, uint16 le struct dfs_EnumStruct e; struct dfs_Info1 s; struct dfs_EnumArray1 e1; + BOOL ret = True; r.in.level = level; r.in.bufsize = (uint32)-1; @@ -72,9 +110,21 @@ static BOOL test_EnumLevel(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, uint16 le NDR_PRINT_DEBUG(dfs_EnumStruct, r.out.info); - return True; + if (level == 1 && r.out.total) { + int i; + for (i=0;i<*r.out.total;i++) { + const char *root = r.out.info->e.info1->s[i].path; + if (!test_Info(p, mem_ctx, root)) { + ret = False; + } + } + + } + + return ret; } + static BOOL test_Enum(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) { BOOL ret = True; @@ -88,6 +138,39 @@ static BOOL test_Enum(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) return ret; } + +static BOOL test_Add(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) +{ + NTSTATUS status; + struct dfs_Add add; + struct dfs_Remove rem; + + add.in.path = "\\\\win2003\\2nd root\\test"; + add.in.server = "win2003"; + add.in.share = "e$"; + add.in.comment = "a test comment"; + add.in.flags = 1; + + status = dcerpc_dfs_Add(p, mem_ctx, &add); + if (!NT_STATUS_IS_OK(status)) { + printf("Add failed - %s\n", nt_errstr(status)); + return False; + } + + rem.in.path = add.in.path; + rem.in.server = add.in.server; + rem.in.share = add.in.share; + + status = dcerpc_dfs_Remove(p, mem_ctx, &rem); + if (!NT_STATUS_IS_OK(status)) { + printf("Add failed - %s\n", nt_errstr(status)); + return False; + } + + return True; +} + + BOOL torture_rpc_dfs(int dummy) { NTSTATUS status; @@ -106,6 +189,12 @@ BOOL torture_rpc_dfs(int dummy) ret = False; } +#if 0 + if (!test_Add(p, mem_ctx)) { + ret = False; + } +#endif + if (!test_Enum(p, mem_ctx)) { ret = False; } |