diff options
-rw-r--r-- | source4/librpc/idl/dfs.idl | 14 | ||||
-rw-r--r-- | source4/torture/rpc/dfs.c | 75 |
2 files changed, 87 insertions, 2 deletions
diff --git a/source4/librpc/idl/dfs.idl b/source4/librpc/idl/dfs.idl index 225436f3aa..dbbd15039c 100644 --- a/source4/librpc/idl/dfs.idl +++ b/source4/librpc/idl/dfs.idl @@ -377,10 +377,20 @@ import "misc.idl"; ); /* Function 0x10 */ - WERROR dfs_GetDcAddress(); + WERROR dfs_GetDcAddress( + [in] [string,charset(UTF16)] uint16 servername[], + [in,out,ref] [string,charset(UTF16)] uint16 **server_fullname, + [in,out,ref] boolean8 *is_root, + [in,out,ref] uint32 *ttl + ); /* Function 0x11 */ - WERROR dfs_SetDcAddress(); + WERROR dfs_SetDcAddress( + [in] [string,charset(UTF16)] uint16 servername[], + [in] [string,charset(UTF16)] uint16 server_fullname[], + [in] uint32 flags, + [in] uint32 ttl + ); /* Function 0x12 */ WERROR dfs_FlushFtTable( diff --git a/source4/torture/rpc/dfs.c b/source4/torture/rpc/dfs.c index 56b0febb4d..5596a5cadf 100644 --- a/source4/torture/rpc/dfs.c +++ b/source4/torture/rpc/dfs.c @@ -522,6 +522,80 @@ static bool test_StdRoot(struct dcerpc_pipe *p, return ret; } +static bool test_GetDcAddress(struct dcerpc_pipe *p, + TALLOC_CTX *mem_ctx, + const char *host) +{ + NTSTATUS status; + struct dfs_GetDcAddress r; + uint8_t is_root = 0; + uint32_t ttl = 0; + const char *ptr; + + printf("Testing GetDcAddress\n"); + + ptr = host; + + r.in.servername = host; + r.in.server_fullname = r.out.server_fullname = &ptr; + r.in.is_root = r.out.is_root = &is_root; + r.in.ttl = r.out.ttl = &ttl; + + status = dcerpc_dfs_GetDcAddress(p, mem_ctx, &r); + if (!NT_STATUS_IS_OK(status)) { + printf("GetDcAddress failed - %s\n", nt_errstr(status)); + return false; + } else if (!W_ERROR_IS_OK(r.out.result)) { + printf("dfs_GetDcAddress failed - %s\n", + win_errstr(r.out.result)); + return false; + } + + return true; +} + +static bool test_SetDcAddress(struct dcerpc_pipe *p, + TALLOC_CTX *mem_ctx, + const char *host) +{ + NTSTATUS status; + struct dfs_SetDcAddress r; + + printf("Testing SetDcAddress\n"); + + r.in.servername = host; + r.in.server_fullname = host; + r.in.flags = 0; + r.in.ttl = 1000; + + status = dcerpc_dfs_SetDcAddress(p, mem_ctx, &r); + if (!NT_STATUS_IS_OK(status)) { + printf("SetDcAddress failed - %s\n", nt_errstr(status)); + return false; + } else if (!W_ERROR_IS_OK(r.out.result)) { + printf("dfs_SetDcAddress failed - %s\n", + win_errstr(r.out.result)); + return false; + } + + return true; +} + +static bool test_DcAddress(struct dcerpc_pipe *p, + TALLOC_CTX *mem_ctx, + const char *host) +{ + if (!test_GetDcAddress(p, mem_ctx, host)) { + return false; + } + + if (!test_SetDcAddress(p, mem_ctx, host)) { + return false; + } + + return true; +} + bool torture_rpc_dfs(struct torture_context *torture) { NTSTATUS status; @@ -538,6 +612,7 @@ bool torture_rpc_dfs(struct torture_context *torture) ret &= test_Enum(p, torture); ret &= test_EnumEx(p, torture, host); ret &= test_StdRoot(p, torture, host); + ret &= test_DcAddress(p, torture, host); return ret; } |