frsapi.c

来自「samba最新软件」· C语言 代码 · 共 276 行

C
276
字号
/*   Unix SMB/CIFS implementation.   test suite for rpc frsapi operations   Copyright (C) Guenther Deschner 2007   This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 3 of the License, or   (at your option) any later version.   This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.*/#include "includes.h"#include "torture/torture.h"#include "torture/rpc/rpc.h"#include "librpc/gen_ndr/ndr_frsapi_c.h"#include "torture/util.h"#include "param/param.h"static bool test_GetDsPollingIntervalW(struct torture_context *tctx,				       struct dcerpc_pipe *p,				       uint32_t *CurrentInterval,				       uint32_t *DsPollingLongInterval,				       uint32_t *DsPollingShortInterval){	struct frsapi_GetDsPollingIntervalW r;	ZERO_STRUCT(r);	r.out.CurrentInterval = CurrentInterval;	r.out.DsPollingLongInterval = DsPollingLongInterval;	r.out.DsPollingShortInterval = DsPollingShortInterval;	torture_assert_ntstatus_ok(tctx,		dcerpc_frsapi_GetDsPollingIntervalW(p, tctx, &r),		"GetDsPollingIntervalW failed");	torture_assert_werr_ok(tctx, r.out.result,			       "GetDsPollingIntervalW failed");	return true;}static bool test_SetDsPollingIntervalW(struct torture_context *tctx,				       struct dcerpc_pipe *p,				       uint32_t CurrentInterval,				       uint32_t DsPollingLongInterval,				       uint32_t DsPollingShortInterval){	struct frsapi_SetDsPollingIntervalW r;	ZERO_STRUCT(r);	r.in.CurrentInterval = CurrentInterval;	r.in.DsPollingLongInterval = DsPollingLongInterval;	r.in.DsPollingShortInterval = DsPollingShortInterval;	torture_assert_ntstatus_ok(tctx,		dcerpc_frsapi_SetDsPollingIntervalW(p, tctx, &r),		"SetDsPollingIntervalW failed");	torture_assert_werr_ok(tctx, r.out.result,			       "SetDsPollingIntervalW failed");	return true;}static bool test_DsPollingIntervalW(struct torture_context *tctx,				    struct dcerpc_pipe *p){	uint32_t i1, i2, i3;	uint32_t k1, k2, k3;	if (!test_GetDsPollingIntervalW(tctx, p, &i1, &i2, &i3)) {		return false;	}	if (!test_SetDsPollingIntervalW(tctx, p, i1, i2, i3)) {		return false;	}	k1 = i1;	k2 = k3 = 0;	if (!test_SetDsPollingIntervalW(tctx, p, k1, k2, k3)) {		return false;	}	if (!test_GetDsPollingIntervalW(tctx, p, &k1, &k2, &k3)) {		return false;	}	if ((i1 != k1) || (i2 != k2) || (i3 != k3)) {		return false;	}	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;	bool ret = true;	if (!test_IsPathReplicated_err(tctx, p, NULL, 0,				       WERR_FRS_INVALID_SERVICE_PARAMETER)) {		ret = false;	}	for (i=0; i<ARRAY_SIZE(lvls); i++) {		if (!_test_IsPathReplicated(tctx, p, dcerpc_server_name(p),					    lvls[i])) {			ret = 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])) {			ret = false;		}	}	for (i=0; i<ARRAY_SIZE(lvls); i++) {		if (!_test_IsPathReplicated(tctx, p,					    "C:\\windows\\sysvol\\domain",					    lvls[i])) {			ret = false;		}	}	return ret;}static bool test_ForceReplication(struct torture_context *tctx,				  struct dcerpc_pipe *p){	struct frsapi_ForceReplication r;	ZERO_STRUCT(r);	r.in.guid1 = NULL;	r.in.guid2 = NULL;	r.in.replica_set = talloc_asprintf(tctx, "%s",					   lp_realm(tctx->lp_ctx));	r.in.partner_name = dcerpc_server_name(p);	torture_assert_ntstatus_ok(tctx,		dcerpc_frsapi_ForceReplication(p, tctx, &r),		"ForceReplication failed");	torture_assert_werr_ok(tctx, r.out.result,			       "ForceReplication failed");	return true;}static bool test_InfoW(struct torture_context *tctx,		       struct dcerpc_pipe *p){	int i;	for (i=0; i<10; i++) {		struct frsapi_InfoW r;		struct frsapi_Info *info;		int d;		DATA_BLOB blob;		ZERO_STRUCT(r);		info = talloc_zero(tctx, struct frsapi_Info);		r.in.length = 0x1000;		r.in.info = r.out.info = info;		info->length = r.in.length;		info->length2 = r.in.length;		info->level = i;		info->offset = 0x2c;		info->blob_len = 0x2c;		torture_assert_ntstatus_ok(tctx,			dcerpc_frsapi_InfoW(p, tctx, &r),			"InfoW failed");		torture_assert_werr_ok(tctx, r.out.result, "InfoW failed");		/* display the formatted blob text */		blob = r.out.info->blob;		for (d = 0; d < blob.length; d++) {			if (blob.data[d]) {				printf("%c", blob.data[d]);			}		}		printf("\n");	}	return true;}struct torture_suite *torture_rpc_frsapi(TALLOC_CTX *mem_ctx){	struct torture_rpc_tcase *tcase;	struct torture_suite *suite = torture_suite_create(mem_ctx, "FRSAPI");	struct torture_test *test;	tcase = torture_suite_add_rpc_iface_tcase(suite, "frsapi",						  &ndr_table_frsapi);	test = torture_rpc_tcase_add_test(tcase, "DsPollingIntervalW",					  test_DsPollingIntervalW);	test = torture_rpc_tcase_add_test(tcase, "IsPathReplicated",					  test_IsPathReplicated);	test = torture_rpc_tcase_add_test(tcase, "ForceReplication",					  test_ForceReplication);	test = torture_rpc_tcase_add_test(tcase, "InfoW",					  test_InfoW);	return suite;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?