dlz_bdb_driver.c

来自「非常好的dns解析软件」· C语言 代码 · 共 798 行 · 第 1/2 页

C
798
字号
	bdb_instance_t *db = (bdb_instance_t *) dbdata;	DBC *zone_cursor = NULL;	DBT key, data;	UNUSED(driverarg);	memset(&key, 0, sizeof(DBT));	memset(&data, 0, sizeof(DBT));	data.flags = DB_DBT_MALLOC;	key.data = strdup(name);	if (key.data == NULL)		return (ISC_R_NOMEMORY);	key.size = strlen(key.data);	/* get a cursor to loop through zone data */	if (db->zone->cursor(db->zone, NULL, &zone_cursor, 0) != 0) {		result = ISC_R_NOTFOUND;		goto findzone_cleanup;	}	switch(zone_cursor->c_get(zone_cursor, &key, &data, DB_SET)) {	case DB_NOTFOUND:	case DB_SECONDARY_BAD:		result = ISC_R_NOTFOUND;		break;	case 0:		result = ISC_R_SUCCESS;		break;	default:		result = ISC_R_FAILURE;	} findzone_cleanup:	/* free any memory duplicate string in the key field */	if (key.data != NULL)		free(key.data);	/* free any memory allocated to the data field. */	if (data.data != NULL)		free(data.data);	/* get rid of zone_cursor */	if (zone_cursor != NULL)		zone_cursor->c_close(zone_cursor);	return result;}static isc_result_tbdb_lookup(const char *zone, const char *name, void *driverarg,	   void *dbdata, dns_sdlzlookup_t *lookup){	isc_result_t result = ISC_R_NOTFOUND;	bdb_instance_t *db = (bdb_instance_t *) dbdata;	DBC *zone_cursor = NULL;	DBC *host_cursor = NULL;	DBC *join_cursor = NULL;	DBT key, data;	DBC *cur_arr[3];	int bdbres;	parsed_data_t pd;	char *tmp_zone, *tmp_host = NULL;	char *tmp = NULL;	UNUSED(driverarg);	memset(&key, 0, sizeof(DBT));	memset(&data, 0, sizeof(DBT));	/* set zone key */	key.data = tmp_zone = strdup(zone);	if (key.data == NULL) {		result = ISC_R_NOMEMORY;		goto lookup_cleanup;	}	key.size = strlen(key.data);	/* get a cursor to loop through zone data */	if (db->zone->cursor(db->zone, NULL, &zone_cursor, 0) != 0) {		result = ISC_R_FAILURE;		goto lookup_cleanup;	}	/* initialize zone_cursor with zone_key */	if (zone_cursor->c_get(zone_cursor, &key, &data, DB_SET) != 0) {		result = ISC_R_NOTFOUND;		goto lookup_cleanup;	}	/* set host key */	key.data = tmp_host = strdup(name);	if (key.data == NULL) {		result = ISC_R_NOMEMORY;		goto lookup_cleanup;	}	key.size = strlen(key.data);	/* get a cursor to loop through host data */	if (db->host->cursor(db->host, NULL, &host_cursor, 0) != 0) {		result = ISC_R_FAILURE;		goto lookup_cleanup;	}	/* initialize host_cursor with host_key */	if (host_cursor->c_get(host_cursor, &key, &data, DB_SET) != 0) {		result = ISC_R_NOTFOUND;		goto lookup_cleanup;	}	cur_arr[0] = zone_cursor;	cur_arr[1] = host_cursor;	cur_arr[2] = NULL;	db->data->join(db->data, cur_arr, &join_cursor, 0);	while ((bdbres = join_cursor->c_get(join_cursor, &key,					    &data, 0)) == 0) {		tmp = realloc(tmp, data.size + 1);		if (tmp == NULL)			goto lookup_cleanup;		strncpy(tmp, data.data, data.size);		tmp[data.size] = '\0';		if (bdb_parse_data(tmp, &pd) != ISC_R_SUCCESS)			goto lookup_cleanup;		result = dns_sdlz_putrr(lookup, pd.type, pd.ttl, pd.data);		if (result != ISC_R_SUCCESS)			goto lookup_cleanup;	} /* end while loop */ lookup_cleanup:	if (tmp != NULL)		free(tmp);	if (tmp_zone != NULL)		free(tmp_zone);	if (tmp_host != NULL)		free(tmp_host);	/* get rid of the joined cusor */	if (join_cursor != NULL)		join_cursor->c_close(join_cursor);	/* get rid of zone_cursor */	if (zone_cursor != NULL)		zone_cursor->c_close(zone_cursor);	/* get rid of host_cursor */	if (host_cursor != NULL)		host_cursor->c_close(host_cursor);	return result;	return ISC_R_NOTFOUND;}/*% Initializes, sets flags and then opens Berkeley databases. */static isc_result_tbdb_opendb(DB_ENV *db_env, DBTYPE db_type, DB **db, const char *db_name,	   char *db_file, int flags) {	int result;	/* Initialize the database. */	if ((result = db_create(db, db_env, 0)) != 0) {		isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,			      DNS_LOGMODULE_DLZ, ISC_LOG_ERROR,			      "BDB could not initialize %s database. "			      "BDB error: %s",			      db_name, db_strerror(result));		return ISC_R_FAILURE;	}	/* set database flags. */	if ((result = (*db)->set_flags(*db, flags)) != 0) {		isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,			      DNS_LOGMODULE_DLZ, ISC_LOG_ERROR,			      "BDB could not set flags for %s database. "			      "BDB error: %s",			      db_name, db_strerror(result));		return ISC_R_FAILURE;	}	/* open the database. */	if ((result = (*db)->open(*db, NULL, db_file, db_name, db_type,				  DB_RDONLY | bdb_threads, 0)) != 0) {		isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,			      DNS_LOGMODULE_DLZ, ISC_LOG_ERROR,			      "BDB could not open %s database in %s. "			      "BDB error: %s",			      db_name, db_file, db_strerror(result));		return ISC_R_FAILURE;	}	return ISC_R_SUCCESS;}static isc_result_tbdb_create(const char *dlzname, unsigned int argc, char *argv[],	   void *driverarg, void **dbdata){	isc_result_t result;	int bdbres;	bdb_instance_t *db = NULL;	UNUSED(dlzname);	UNUSED(driverarg);	/* verify we have 3 arg's passed to the driver */	if (argc != 3) {		isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,			      DNS_LOGMODULE_DLZ, ISC_LOG_ERROR,			      "Berkeley DB driver requires at least "			      "2 command line args.");		return (ISC_R_FAILURE);	}	/* allocate and zero memory for driver structure */	db = isc_mem_get(ns_g_mctx, sizeof(bdb_instance_t));	if (db == NULL) {		isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,			      DNS_LOGMODULE_DLZ, ISC_LOG_ERROR,			      "Could not allocate memory for "			      "database instance object.");		return (ISC_R_NOMEMORY);	}	memset(db, 0, sizeof(bdb_instance_t));	/* attach to the memory context */	isc_mem_attach(ns_g_mctx, &db->mctx);	/* create BDB environment	 * Basically BDB allocates and assigns memory to db->dbenv	 */	bdbres = db_env_create(&db->dbenv, 0);	if (bdbres != 0) {		isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,			      DNS_LOGMODULE_DLZ, ISC_LOG_ERROR,			      "BDB environment could not be created. "			      "BDB error: %s",			      db_strerror(bdbres));		result = ISC_R_FAILURE;		goto init_cleanup;	}	/* open BDB environment */	bdbres = db->dbenv->open(db->dbenv, argv[1],				 DB_INIT_CDB | DB_INIT_MPOOL |				 bdb_threads | DB_CREATE,				 0);	if (bdbres != 0) {		isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,			      DNS_LOGMODULE_DLZ, ISC_LOG_ERROR,			      "BDB environment at '%s' could not be opened. "			      "BDB error: %s",			      argv[1], db_strerror(bdbres));		result = ISC_R_FAILURE;		goto init_cleanup;	}	/* open dlz_data database. */	result = bdb_opendb(db->dbenv, DB_UNKNOWN, &db->data,			    dlz_data, argv[2], 0);	if (result != ISC_R_SUCCESS)		goto init_cleanup;	/* open dlz_host database. */	result = bdb_opendb(db->dbenv, DB_UNKNOWN, &db->host,			    dlz_host, argv[2],			    DB_DUP | DB_DUPSORT);	if (result != ISC_R_SUCCESS)		goto init_cleanup;	/* open dlz_zone database. */	result = bdb_opendb(db->dbenv, DB_UNKNOWN, &db->zone,			    dlz_zone, argv[2],			    DB_DUP | DB_DUPSORT);	if (result != ISC_R_SUCCESS)		goto init_cleanup;	/* open dlz_client database. */	result = bdb_opendb(db->dbenv, DB_UNKNOWN, &db->client,			    dlz_client, argv[2], DB_DUP | DB_DUPSORT);	if (result != ISC_R_SUCCESS)		goto init_cleanup;	/* associate the host secondary database with the primary database */	bdbres = db->data->associate(db->data, NULL, db->host, NULL, 0);	if (bdbres != 0) {		isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,			      DNS_LOGMODULE_DLZ, ISC_LOG_ERROR,			      "BDB could not associate %s database with %s. "			      "BDB error: %s",			      dlz_host, dlz_data, db_strerror(bdbres));		result = ISC_R_FAILURE;		goto init_cleanup;	}	/* associate the zone secondary database with the primary database */	bdbres = db->data->associate(db->data, NULL, db->zone, NULL, 0);	if (bdbres != 0) {		isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,			      DNS_LOGMODULE_DLZ, ISC_LOG_ERROR,			      "BDB could not associate %s database with %s. "			      "BDB error: %s",			      dlz_zone, dlz_data, db_strerror(bdbres));		result = ISC_R_FAILURE;		goto init_cleanup;	}	*dbdata = db;	return(ISC_R_SUCCESS); init_cleanup:	bdb_cleanup(db);	return result;}static voidbdb_destroy(void *driverarg, void *dbdata){	UNUSED(driverarg);	bdb_cleanup((bdb_instance_t *) dbdata);}/* bdb_authority not needed as authority data is returned by lookup */static dns_sdlzmethods_t dlz_bdb_methods = {	bdb_create,	bdb_destroy,	bdb_findzone,	bdb_lookup,	NULL,	bdb_allnodes,	bdb_allowzonexfr};/*% * Wrapper around dns_sdlzregister(). */isc_result_tdlz_bdb_init(void) {	isc_result_t result;	/*	 * Write debugging message to log	 */	isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,		      DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(2),		      "Registering DLZ bdb driver.");	result = dns_sdlzregister("bdb", &dlz_bdb_methods, NULL,				  DNS_SDLZFLAG_RELATIVEOWNER |				  DNS_SDLZFLAG_RELATIVERDATA |				  DNS_SDLZFLAG_THREADSAFE,				  ns_g_mctx, &dlz_bdb);	if (result != ISC_R_SUCCESS) {		UNEXPECTED_ERROR(__FILE__, __LINE__,				 "dns_sdlzregister() failed: %s",				 isc_result_totext(result));		result = ISC_R_UNEXPECTED;	}	return result;}/*% * Wrapper around dns_sdlzunregister(). */voiddlz_bdb_clear(void) {	/*	 * Write debugging message to log	 */	isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,		      DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(2),		      "Unregistering DLZ bdb driver.");	if (dlz_bdb != NULL)		dns_sdlzunregister(&dlz_bdb);}#endif

⌨️ 快捷键说明

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