summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/librpc/idl/frsapi.idl10
-rw-r--r--source4/torture/rpc/frsapi.c80
2 files changed, 88 insertions, 2 deletions
diff --git a/source4/librpc/idl/frsapi.idl b/source4/librpc/idl/frsapi.idl
index d75be0ec04..df12f44892 100644
--- a/source4/librpc/idl/frsapi.idl
+++ b/source4/librpc/idl/frsapi.idl
@@ -71,13 +71,19 @@ interface frsapi
/****************/
/* Function 0x08 */
+ typedef [v1_enum] enum {
+ FRSAPI_REPLICA_SET_TYPE_0 = 0x00000000,
+ FRSAPI_REPLICA_SET_TYPE_DOMAIN = 0x00000002,
+ FRSAPI_REPLICA_SET_TYPE_DFS = 0x00000003
+ } frsapi_ReplicaSetType;
+
WERROR frsapi_IsPathReplicated(
[in,unique] [string,charset(UTF16)] uint16 *path,
- [in] uint32 unknown,
+ [in] frsapi_ReplicaSetType replica_set_type,
[out] uint32 *unknown1,
[out] uint32 *unknown2,
[out] uint32 *unknown3,
- [out] GUID *guid
+ [out] GUID *replica_set_guid
);
/****************/
diff --git a/source4/torture/rpc/frsapi.c b/source4/torture/rpc/frsapi.c
index d65d551554..a382b1e415 100644
--- a/source4/torture/rpc/frsapi.c
+++ b/source4/torture/rpc/frsapi.c
@@ -105,6 +105,83 @@ static bool test_DsPollingIntervalW(struct torture_context *tctx,
return true;
}
+static bool test_IsPathReplicated_err(struct torture_context *tctx,
+ struct dcerpc_pipe *p,
+ const char *path,
+ uint32_t type,
+ WERROR werr)
+{
+ struct frsapi_IsPathReplicated r;
+ struct GUID guid;
+ uint32_t unknown1, unknown2, unknown3 = 0;
+
+ ZERO_STRUCT(r);
+
+ r.in.path = path;
+ r.in.replica_set_type = type;
+ r.out.unknown1 = &unknown1;
+ r.out.unknown2 = &unknown2;
+ r.out.unknown3 = &unknown3;
+ r.out.replica_set_guid = &guid;
+
+ torture_assert_ntstatus_ok(tctx,
+ dcerpc_frsapi_IsPathReplicated(p, tctx, &r),
+ "IsPathReplicated failed");
+
+ torture_assert_werr_equal(tctx, r.out.result, werr,
+ "GetDsPollingIntervalW failed");
+
+ return true;
+}
+
+static bool _test_IsPathReplicated(struct torture_context *tctx,
+ struct dcerpc_pipe *p,
+ const char *path,
+ uint32_t type)
+{
+ return test_IsPathReplicated_err(tctx, p, path, type, WERR_OK);
+}
+
+static bool test_IsPathReplicated(struct torture_context *tctx,
+ struct dcerpc_pipe *p)
+{
+ const uint32_t lvls[] = {
+ FRSAPI_REPLICA_SET_TYPE_0,
+ FRSAPI_REPLICA_SET_TYPE_DOMAIN,
+ FRSAPI_REPLICA_SET_TYPE_DFS };
+ int i;
+
+ if (!test_IsPathReplicated_err(tctx, p, NULL, 0,
+ WERR_FRS_INVALID_SERVICE_PARAMETER)) {
+ return false;
+ }
+
+ for (i=0; i<ARRAY_SIZE(lvls); i++) {
+ if (!_test_IsPathReplicated(tctx, p, dcerpc_server_name(p),
+ lvls[i])) {
+ return false;
+ }
+ }
+
+ for (i=0; i<ARRAY_SIZE(lvls); i++) {
+ const char *path = talloc_asprintf(tctx, "\\\\%s\\SYSVOL",
+ dcerpc_server_name(p));
+ if (!_test_IsPathReplicated(tctx, p, path, lvls[i])) {
+ return false;
+ }
+ }
+
+ for (i=0; i<ARRAY_SIZE(lvls); i++) {
+ if (!_test_IsPathReplicated(tctx, p,
+ "C:\\windows\\sysvol\\domain",
+ lvls[i])) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
struct torture_suite *torture_rpc_frsapi(TALLOC_CTX *mem_ctx)
{
struct torture_rpc_tcase *tcase;
@@ -117,5 +194,8 @@ struct torture_suite *torture_rpc_frsapi(TALLOC_CTX *mem_ctx)
test = torture_rpc_tcase_add_test(tcase, "DsPollingIntervalW",
test_DsPollingIntervalW);
+ test = torture_rpc_tcase_add_test(tcase, "IsPathReplicated",
+ test_IsPathReplicated);
+
return suite;
}