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

📄 query.c

📁 bind 9.3结合mysql数据库
💻 C
📖 第 1 页 / 共 5 页
字号:
	result = query_newnamebuf(client);	if (result != ISC_R_SUCCESS)		query_freefreeversions(client, ISC_TRUE);	return (result);}static inline ns_dbversion_t *query_findversion(ns_client_t *client, dns_db_t *db,		  isc_boolean_t *newzonep){	ns_dbversion_t *dbversion;	/*	 * We may already have done a query related to this	 * database.  If so, we must be sure to make subsequent	 * queries from the same version.	 */	for (dbversion = ISC_LIST_HEAD(client->query.activeversions);	     dbversion != NULL;	     dbversion = ISC_LIST_NEXT(dbversion, link)) {		if (dbversion->db == db)			break;	}	if (dbversion == NULL) {		/*		 * This is a new zone for this query.  Add it to		 * the active list.		 */		dbversion = query_getdbversion(client);		if (dbversion == NULL)			return (NULL);		dns_db_attach(db, &dbversion->db);		dns_db_currentversion(db, &dbversion->version);		dbversion->queryok = ISC_FALSE;		ISC_LIST_APPEND(client->query.activeversions,				dbversion, link);		*newzonep = ISC_TRUE;	} else		*newzonep = ISC_FALSE;	return (dbversion);}static inline isc_result_tquery_getzonedb(ns_client_t *client, dns_name_t *name, dns_rdatatype_t qtype,		unsigned int options, dns_zone_t **zonep, dns_db_t **dbp,		dns_dbversion_t **versionp){	isc_result_t result;	isc_boolean_t check_acl, new_zone;	dns_acl_t *queryacl;	ns_dbversion_t *dbversion;	unsigned int ztoptions;	dns_zone_t *zone = NULL;	dns_db_t *db = NULL;	isc_boolean_t partial = ISC_FALSE;	REQUIRE(zonep != NULL && *zonep == NULL);	REQUIRE(dbp != NULL && *dbp == NULL);	/*	 * Find a zone database to answer the query.	 */	ztoptions = ((options & DNS_GETDB_NOEXACT) != 0) ?		DNS_ZTFIND_NOEXACT : 0;	result = dns_zt_find(client->view->zonetable, name, ztoptions, NULL,			     &zone);	if (result == DNS_R_PARTIALMATCH)		partial = ISC_TRUE;	if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH)		result = dns_zone_getdb(zone, &db);	if (result != ISC_R_SUCCESS)				goto fail;	/*	 * This limits our searching to the zone where the first name	 * (the query target) was looked for.  This prevents following	 * CNAMES or DNAMES into other zones and prevents returning 	 * additional data from other zones.	 */	if (!client->view->additionalfromauth &&	    client->query.authdbset &&	    db != client->query.authdb)		goto refuse;	/*	 * If the zone has an ACL, we'll check it, otherwise	 * we use the view's "allow-query" ACL.  Each ACL is only checked	 * once per query.	 *	 * Also, get the database version to use.	 */	check_acl = ISC_TRUE;	/* Keep compiler happy. */	queryacl = NULL;	/*	 * Get the current version of this database.	 */	dbversion = query_findversion(client, db, &new_zone);	if (dbversion == NULL) {		result = DNS_R_SERVFAIL;		goto fail;	}	if (new_zone) {		check_acl = ISC_TRUE;	} else if (!dbversion->queryok) {		goto refuse;	} else {		check_acl = ISC_FALSE;	}	queryacl = dns_zone_getqueryacl(zone);	if (queryacl == NULL) {		queryacl = client->view->queryacl;		if ((client->query.attributes &		     NS_QUERYATTR_QUERYOKVALID) != 0) {			/*			 * We've evaluated the view's queryacl already.  If			 * NS_QUERYATTR_QUERYOK is set, then the client is			 * allowed to make queries, otherwise the query should			 * be refused.			 */			check_acl = ISC_FALSE;			if ((client->query.attributes &			     NS_QUERYATTR_QUERYOK) == 0)				goto refuse;		} else {			/*			 * We haven't evaluated the view's queryacl yet.			 */			check_acl = ISC_TRUE;		}	}	if (check_acl) {		isc_boolean_t log = ISC_TF((options & DNS_GETDB_NOLOG) == 0);		result = ns_client_checkaclsilent(client, queryacl, ISC_TRUE);		if (log) {			char msg[NS_CLIENT_ACLMSGSIZE("query")];			if (result == ISC_R_SUCCESS) {				if (isc_log_wouldlog(ns_g_lctx,						     ISC_LOG_DEBUG(3)))				{					ns_client_aclmsg("query", name, qtype,							 client->view->rdclass,							 msg, sizeof(msg));					ns_client_log(client,						      DNS_LOGCATEGORY_SECURITY,						      NS_LOGMODULE_QUERY,						      ISC_LOG_DEBUG(3),						      "%s approved", msg);				}		    	} else {				ns_client_aclmsg("query", name, qtype,						 client->view->rdclass,						 msg, sizeof(msg));				ns_client_log(client, DNS_LOGCATEGORY_SECURITY,					      NS_LOGMODULE_QUERY, ISC_LOG_INFO,					      "%s denied", msg);			}		}		if (queryacl == client->view->queryacl) {			if (result == ISC_R_SUCCESS) {				/*				 * We were allowed by the default				 * "allow-query" ACL.  Remember this so we				 * don't have to check again.				 */				client->query.attributes |=					NS_QUERYATTR_QUERYOK;			}			/*			 * We've now evaluated the view's query ACL, and			 * the NS_QUERYATTR_QUERYOK attribute is now valid.			 */			client->query.attributes |= NS_QUERYATTR_QUERYOKVALID;		}		if (result != ISC_R_SUCCESS)			goto refuse;	}	/* Approved. */	/*	 * Remember the result of the ACL check so we	 * don't have to check again.	 */	dbversion->queryok = ISC_TRUE;	/* Transfer ownership. */	*zonep = zone;	*dbp = db;	*versionp = dbversion->version;	if (partial && (options & DNS_GETDB_PARTIAL) != 0)		return (DNS_R_PARTIALMATCH);	return (ISC_R_SUCCESS); refuse:	result = DNS_R_REFUSED; fail:	if (zone != NULL)		dns_zone_detach(&zone);	if (db != NULL)		dns_db_detach(&db);	return (result);}static inline isc_result_tquery_getcachedb(ns_client_t *client, dns_name_t *name, dns_rdatatype_t qtype,		 dns_db_t **dbp, unsigned int options){	isc_result_t result;	isc_boolean_t check_acl;	dns_db_t *db = NULL;	REQUIRE(dbp != NULL && *dbp == NULL);	/*	 * Find a cache database to answer the query.	 * This may fail with DNS_R_REFUSED if the client	 * is not allowed to use the cache.	 */	if (!USECACHE(client))		return (DNS_R_REFUSED);	dns_db_attach(client->view->cachedb, &db);	if ((client->query.attributes &	     NS_QUERYATTR_QUERYOKVALID) != 0) {		/*		 * We've evaluated the view's queryacl already.  If		 * NS_QUERYATTR_QUERYOK is set, then the client is		 * allowed to make queries, otherwise the query should		 * be refused.		 */		check_acl = ISC_FALSE;		if ((client->query.attributes &		     NS_QUERYATTR_QUERYOK) == 0)			goto refuse;	} else {		/*		 * We haven't evaluated the view's queryacl yet.		 */		check_acl = ISC_TRUE;	}	if (check_acl) {		isc_boolean_t log = ISC_TF((options & DNS_GETDB_NOLOG) == 0);		char msg[NS_CLIENT_ACLMSGSIZE("query (cache)")];				result = ns_client_checkaclsilent(client,						  client->view->queryacl,						  ISC_TRUE);		if (result == ISC_R_SUCCESS) {			/*			 * We were allowed by the default			 * "allow-query" ACL.  Remember this so we			 * don't have to check again.			 */			client->query.attributes |=				NS_QUERYATTR_QUERYOK;			if (log && isc_log_wouldlog(ns_g_lctx,						     ISC_LOG_DEBUG(3)))			{				ns_client_aclmsg("query (cache)", name, qtype,						 client->view->rdclass,						 msg, sizeof(msg));				ns_client_log(client,					      DNS_LOGCATEGORY_SECURITY,					      NS_LOGMODULE_QUERY,					      ISC_LOG_DEBUG(3),					      "%s approved", msg);			}		} else if (log) {			ns_client_aclmsg("query (cache)", name, qtype,					 client->view->rdclass, msg,					 sizeof(msg));			ns_client_log(client, DNS_LOGCATEGORY_SECURITY,				      NS_LOGMODULE_QUERY, ISC_LOG_INFO,				      "%s denied", msg);		}		/*		 * We've now evaluated the view's query ACL, and		 * the NS_QUERYATTR_QUERYOK attribute is now valid.		 */		client->query.attributes |= NS_QUERYATTR_QUERYOKVALID;		if (result != ISC_R_SUCCESS)			goto refuse;	}	/* Approved. */	/* Transfer ownership. */	*dbp = db;	return (ISC_R_SUCCESS); refuse:	result = DNS_R_REFUSED;	if (db != NULL)		dns_db_detach(&db);	return (result);}static inline isc_result_tquery_getdb(ns_client_t *client, dns_name_t *name, dns_rdatatype_t qtype,	    unsigned int options, dns_zone_t **zonep, dns_db_t **dbp,	    dns_dbversion_t **versionp, isc_boolean_t *is_zonep){	isc_result_t result;	result = query_getzonedb(client, name, qtype, options,				 zonep, dbp, versionp);	if (result == ISC_R_SUCCESS) {		*is_zonep = ISC_TRUE;	} else if (result == ISC_R_NOTFOUND) {		result = query_getcachedb(client, name, qtype, dbp, options);		*is_zonep = ISC_FALSE;	}	return (result);}static inline isc_boolean_tquery_isduplicate(ns_client_t *client, dns_name_t *name,		  dns_rdatatype_t type, dns_name_t **mnamep){	dns_section_t section;	dns_name_t *mname = NULL;	isc_result_t result;	CTRACE("query_isduplicate");	for (section = DNS_SECTION_ANSWER;	     section <= DNS_SECTION_ADDITIONAL;	     section++) {		result = dns_message_findname(client->message, section,					      name, type, 0, &mname, NULL);		if (result == ISC_R_SUCCESS) {			/*			 * We've already got this RRset in the response.			 */			CTRACE("query_isduplicate: true: done");			return (ISC_TRUE);		} else if (result == DNS_R_NXRRSET) {			/*			 * The name exists, but the rdataset does not.			 */			if (section == DNS_SECTION_ADDITIONAL)				break;		} else			RUNTIME_CHECK(result == DNS_R_NXDOMAIN);		mname = NULL;	}	/*	 * If the dns_name_t we're looking up is already in the message,	 * we don't want to trigger the caller's name replacement logic.	 */	if (name == mname)		mname = NULL;	*mnamep = mname;	CTRACE("query_isduplicate: false: done");	return (ISC_FALSE);}static isc_result_tquery_addadditional(void *arg, dns_name_t *name, dns_rdatatype_t qtype) {	ns_client_t *client = arg;	isc_result_t result, eresult;	dns_dbnode_t *node;	dns_db_t *db;	dns_name_t *fname, *mname;	dns_rdataset_t *rdataset, *sigrdataset, *trdataset;	isc_buffer_t *dbuf;	isc_buffer_t b;	dns_dbversion_t *version;	isc_boolean_t added_something, need_addname;	dns_zone_t *zone;	dns_rdatatype_t type;	REQUIRE(NS_CLIENT_VALID(client));	REQUIRE(qtype != dns_rdatatype_any);	if (!WANTDNSSEC(client) && dns_rdatatype_isdnssec(qtype))		return (ISC_R_SUCCESS);	CTRACE("query_addadditional");	/*	 * Initialization.	 */	eresult = ISC_R_SUCCESS;	fname = NULL;	rdataset = NULL;	sigrdataset = NULL;	trdataset = NULL;	db = NULL;	version = NULL;	node = NULL;	added_something = ISC_FALSE;	need_addname = ISC_FALSE;	zone = NULL;	/*	 * We treat type A additional section processing as if it	 * were "any address type" additional section processing.	 * To avoid multiple lookups, we do an 'any' database	 * lookup and iterate over the node.	 */	if (qtype == dns_rdatatype_a)		type = dns_rdatatype_any;	else		type = qtype;	/*	 * Get some resources.	 */	dbuf = query_getnamebuf(client);	if (dbuf == NULL)		goto cleanup;	fname = query_newname(client, dbuf, &b);	rdataset = query_newrdataset(client);	if (fname == NULL || rdataset == NULL)		goto cleanup;	if (WANTDNSSEC(client)) {		sigrdataset = query_newrdataset(client);		if (sigrdataset == NULL)			goto cleanup;	}	/*	 * Look for a zone database that might contain authoritative	 * additional data.	 */	result = query_getzonedb(client, name, qtype, DNS_GETDB_NOLOG,				 &zone, &db, &version);	if (result != ISC_R_SUCCESS)		goto try_cache;	CTRACE("query_addadditional: db_find");	/*	 * Since we are looking for authoritative data, we do not set	 * the GLUEOK flag.  Glue will be looked for later, but not	 * necessarily in the same database.	 */	node = NULL;	result = dns_db_find(db, name, version, type, client->query.dboptions,			     client->now, &node, fname, rdataset,			     sigrdataset);	if (result == ISC_R_SUCCESS)		goto found;	if (dns_rdataset_isassociated(rdataset))		dns_rdataset_disassociate(rdataset);	if (sigrdataset != NULL && dns_rdataset_isassociated(sigrdataset))		dns_rdataset_disassociate(sigrdataset);	if (node != NULL)		dns_db_detachnode(db, &node);	version = NULL;	dns_db_detach(&db);	/*	 * No authoritative data was found.  The cache is our next best bet.	 */ try_cache:	result = query_getcachedb(client, name, qtype, &db, DNS_GETDB_NOLOG);	if (result != ISC_R_SUCCESS)		/*		 * Most likely the client isn't allowed to query the cache.		 */		goto try_glue;	result = dns_db_find(db, name, version, type,  client->query.dboptions,			     client->now, &node, fname, rdataset,			     sigrdataset);	if (result == ISC_R_SUCCESS)

⌨️ 快捷键说明

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