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