⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wrepl_scavenging.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
/*    Unix SMB/CIFS implementation.      WINS Replication server      Copyright (C) Stefan Metzmacher	2005      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, see <http://www.gnu.org/licenses/>.*/#include "includes.h"#include "librpc/gen_ndr/ndr_winsrepl.h"#include "wrepl_server/wrepl_server.h"#include "nbt_server/wins/winsdb.h"#include "ldb/include/ldb.h"#include "ldb/include/ldb_errors.h"#include "system/time.h"#include "smbd/service_task.h"#include "lib/messaging/irpc.h"#include "librpc/gen_ndr/ndr_irpc.h"#include "librpc/gen_ndr/ndr_nbt.h"const char *wreplsrv_owner_filter(struct wreplsrv_service *service,				  TALLOC_CTX *mem_ctx,				  const char *wins_owner){	if (strcmp(wins_owner, service->wins_db->local_owner) == 0) {		return talloc_asprintf(mem_ctx, "(|(winsOwner=%s)(winsOwner=0.0.0.0))",				       wins_owner);	}	return talloc_asprintf(mem_ctx, "(&(winsOwner=%s)(!(winsOwner=0.0.0.0)))",			       wins_owner);}static NTSTATUS wreplsrv_scavenging_owned_records(struct wreplsrv_service *service, TALLOC_CTX *tmp_mem){	NTSTATUS status;	struct winsdb_record *rec = NULL;	struct ldb_result *res = NULL;	const char *owner_filter;	const char *filter;	uint32_t i;	int ret;	time_t now = time(NULL);	const char *now_timestr;	const char *action;	const char *old_state=NULL;	const char *new_state=NULL;	uint32_t modify_flags;	bool modify_record;	bool delete_record;	bool delete_tombstones;	struct timeval tombstone_extra_time;	now_timestr = ldb_timestring(tmp_mem, now);	NT_STATUS_HAVE_NO_MEMORY(now_timestr);	owner_filter = wreplsrv_owner_filter(service, tmp_mem,					     service->wins_db->local_owner);	NT_STATUS_HAVE_NO_MEMORY(owner_filter);	filter = talloc_asprintf(tmp_mem,				 "(&%s(objectClass=winsRecord)"				 "(expireTime<=%s))",				 owner_filter, now_timestr);	NT_STATUS_HAVE_NO_MEMORY(filter);	ret = ldb_search(service->wins_db->ldb, NULL, LDB_SCOPE_SUBTREE, filter, NULL, &res);	if (ret != LDB_SUCCESS) return NT_STATUS_INTERNAL_DB_CORRUPTION;	talloc_steal(tmp_mem, res);	DEBUG(10,("WINS scavenging: filter '%s' count %d\n", filter, res->count));	tombstone_extra_time = timeval_add(&service->startup_time,					   service->config.tombstone_extra_timeout,					   0);	delete_tombstones = timeval_expired(&tombstone_extra_time);	for (i=0; i < res->count; i++) {		/*		 * we pass '0' as 'now' here,		 * because we want to get the raw timestamps which are in the DB		 */		status = winsdb_record(service->wins_db, res->msgs[i], tmp_mem, 0, &rec);		NT_STATUS_NOT_OK_RETURN(status);		talloc_free(res->msgs[i]);		modify_flags	= 0;		modify_record	= false;		delete_record	= false;		switch (rec->state) {		case WREPL_STATE_ACTIVE:			old_state	= "active";			new_state	= "active";			if (!rec->is_static) {				new_state	= "released";				rec->state	= WREPL_STATE_RELEASED;				rec->expire_time= service->config.tombstone_interval + now;			}			modify_flags	= 0;			modify_record	= true;			break;		case WREPL_STATE_RELEASED:			old_state	= "released";			new_state	= "tombstone";			rec->state	= WREPL_STATE_TOMBSTONE;			rec->expire_time= service->config.tombstone_timeout + now;			modify_flags	= WINSDB_FLAG_ALLOC_VERSION | WINSDB_FLAG_TAKE_OWNERSHIP;			modify_record	= true;			break;		case WREPL_STATE_TOMBSTONE:			old_state	= "tombstone";			new_state	= "tombstone";			if (!delete_tombstones) break;			new_state	= "deleted";			delete_record = true;			break;		case WREPL_STATE_RESERVED:			DEBUG(0,("%s: corrupted record: %s\n",				__location__, nbt_name_string(rec, rec->name)));			return NT_STATUS_INTERNAL_DB_CORRUPTION;		}		if (modify_record) {			action = "modify";			ret = winsdb_modify(service->wins_db, rec, modify_flags);		} else if (delete_record) {			action = "delete";			ret = winsdb_delete(service->wins_db, rec);		} else {			action = "skip";			ret = NBT_RCODE_OK;		}		if (ret != NBT_RCODE_OK) {			DEBUG(1,("WINS scavenging: failed to %s name %s (owned:%s -> owned:%s): error:%u\n",				action, nbt_name_string(rec, rec->name), old_state, new_state, ret));		} else {			DEBUG(4,("WINS scavenging: %s name: %s (owned:%s -> owned:%s)\n",				action, nbt_name_string(rec, rec->name), old_state, new_state));		}		talloc_free(rec);	}	return NT_STATUS_OK;}static NTSTATUS wreplsrv_scavenging_replica_non_active_records(struct wreplsrv_service *service, TALLOC_CTX *tmp_mem){	NTSTATUS status;	struct winsdb_record *rec = NULL;	struct ldb_result *res = NULL;	const char *owner_filter;	const char *filter;	uint32_t i;	int ret;	time_t now = time(NULL);	const char *now_timestr;	const char *action;	const char *old_state=NULL;	const char *new_state=NULL;	uint32_t modify_flags;	bool modify_record;	bool delete_record;	bool delete_tombstones;	struct timeval tombstone_extra_time;	now_timestr = ldb_timestring(tmp_mem, now);	NT_STATUS_HAVE_NO_MEMORY(now_timestr);	owner_filter = wreplsrv_owner_filter(service, tmp_mem,					     service->wins_db->local_owner);	NT_STATUS_HAVE_NO_MEMORY(owner_filter);	filter = talloc_asprintf(tmp_mem,				 "(&(!%s)(objectClass=winsRecord)"				 "(!(recordState=%u))(expireTime<=%s))",				 owner_filter, WREPL_STATE_ACTIVE, now_timestr);	NT_STATUS_HAVE_NO_MEMORY(filter);	ret = ldb_search(service->wins_db->ldb, NULL, LDB_SCOPE_SUBTREE, filter, NULL, &res);	if (ret != LDB_SUCCESS) return NT_STATUS_INTERNAL_DB_CORRUPTION;	talloc_steal(tmp_mem, res);	DEBUG(10,("WINS scavenging: filter '%s' count %d\n", filter, res->count));	tombstone_extra_time = timeval_add(&service->startup_time,					   service->config.tombstone_extra_timeout,					   0);	delete_tombstones = timeval_expired(&tombstone_extra_time);	for (i=0; i < res->count; i++) {		/*		 * we pass '0' as 'now' here,		 * because we want to get the raw timestamps which are in the DB		 */		status = winsdb_record(service->wins_db, res->msgs[i], tmp_mem, 0, &rec);		NT_STATUS_NOT_OK_RETURN(status);		talloc_free(res->msgs[i]);		modify_flags	= 0;		modify_record	= false;		delete_record	= false;		switch (rec->state) {		case WREPL_STATE_ACTIVE:			DEBUG(0,("%s: corrupted record: %s\n",				__location__, nbt_name_string(rec, rec->name)));			return NT_STATUS_INTERNAL_DB_CORRUPTION;		case WREPL_STATE_RELEASED:			old_state	= "released";			new_state	= "tombstone";			rec->state	= WREPL_STATE_TOMBSTONE;			rec->expire_time= service->config.tombstone_timeout + now;			modify_flags	= 0;			modify_record	= true;			break;		case WREPL_STATE_TOMBSTONE:			old_state	= "tombstone";			new_state	= "tombstone";			if (!delete_tombstones) break;			new_state	= "deleted";			delete_record = true;			break;		case WREPL_STATE_RESERVED:			DEBUG(0,("%s: corrupted record: %s\n",				__location__, nbt_name_string(rec, rec->name)));			return NT_STATUS_INTERNAL_DB_CORRUPTION;		}		if (modify_record) {			action = "modify";			ret = winsdb_modify(service->wins_db, rec, modify_flags);		} else if (delete_record) {			action = "delete";			ret = winsdb_delete(service->wins_db, rec);		} else {			action = "skip";			ret = NBT_RCODE_OK;		}		if (ret != NBT_RCODE_OK) {			DEBUG(1,("WINS scavenging: failed to %s name %s (replica:%s -> replica:%s): error:%u\n",				action, nbt_name_string(rec, rec->name), old_state, new_state, ret));		} else {			DEBUG(4,("WINS scavenging: %s name: %s (replica:%s -> replica:%s)\n",				action, nbt_name_string(rec, rec->name), old_state, new_state));		}		talloc_free(rec);	}

⌨️ 快捷键说明

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