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 + -
显示快捷键?