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

📄 name.h

📁 package of develop dns
💻 H
📖 第 1 页 / 共 3 页
字号:
/* * Copyright (C) 2004  Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1998-2003  Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. *//* $Id: name.h,v 1.95.2.3.2.12 2004/09/08 00:29:34 marka Exp $ */#ifndef DNS_NAME_H#define DNS_NAME_H 1/***** ***** Module Info *****//* * DNS Names and Labels * * Provides facilities for manipulating DNS names and labels, including * conversions to and from wire format and text format. * * Given the large number of names possible in a nameserver, and because * names occur in rdata, it was important to come up with a very efficient * way of storing name data, but at the same time allow names to be * manipulated.  The decision was to store names in uncompressed wire format, * and not to make them fully abstracted objects; i.e. certain parts of the * server know names are stored that way.  This saves a lot of memory, and * makes adding names to messages easy.  Having much of the server know * the representation would be perilous, and we certainly don't want each * user of names to be manipulating such a low-level structure.  This is * where the Names and Labels module comes in.  The module allows name or * label handles to be created and attached to uncompressed wire format * regions.  All name operations and conversions are done through these * handles. * * MP: *	Clients of this module must impose any required synchronization. * * Reliability: *	This module deals with low-level byte streams.  Errors in any of *	the functions are likely to crash the server or corrupt memory. * * Resources: *	None. * * Security: * *	*** WARNING *** * *	dns_name_fromwire() deals with raw network data.  An error in *	this routine could result in the failure or hijacking of the server. * * Standards: *	RFC 1035 *	Draft EDNS0 (0) *	Draft Binary Labels (2) * *//*** *** Imports ***/#include <stdio.h>#include <isc/boolean.h>#include <isc/lang.h>#include <isc/magic.h>#include <isc/region.h>		/* Required for storage size of dns_label_t. */#include <dns/types.h>ISC_LANG_BEGINDECLS/***** ***** Labels ***** ***** A 'label' is basically a region.  It contains one DNS wire format ***** label of type 00 (ordinary). *****//***** ***** Names ***** ***** A 'name' is a handle to a binary region.  It contains a sequence of one ***** or more DNS wire format labels of type 00 (ordinary). ***** Note that all names are not required to end with the root label, ***** as they are in the actual DNS wire protocol. *****//*** *** Compression pointer chaining limit ***/#define DNS_POINTER_MAXHOPS		16/*** *** Types ***//* * Clients are strongly discouraged from using this type directly,  with * the exception of the 'link' and 'list' fields which may be used directly * for whatever purpose the client desires. */struct dns_name {	unsigned int			magic;	unsigned char *			ndata;	unsigned int			length;	unsigned int			labels;	unsigned int			attributes;	unsigned char *			offsets;	isc_buffer_t *			buffer;	ISC_LINK(dns_name_t)		link;	ISC_LIST(dns_rdataset_t)	list;};#define DNS_NAME_MAGIC			ISC_MAGIC('D','N','S','n')#define DNS_NAMEATTR_ABSOLUTE		0x0001#define DNS_NAMEATTR_READONLY		0x0002#define DNS_NAMEATTR_DYNAMIC		0x0004#define DNS_NAMEATTR_DYNOFFSETS		0x0008/* * Attributes below 0x0100 reserved for name.c usage. */#define DNS_NAMEATTR_CACHE		0x0100		/* Used by resolver. */#define DNS_NAMEATTR_ANSWER		0x0200		/* Used by resolver. */#define DNS_NAMEATTR_NCACHE		0x0400		/* Used by resolver. */#define DNS_NAMEATTR_CHAINING		0x0800		/* Used by resolver. */#define DNS_NAMEATTR_CHASE		0x1000		/* Used by resolver. */#define DNS_NAMEATTR_WILDCARD		0x2000		/* Used by server. */#define DNS_NAME_DOWNCASE		0x0001#define DNS_NAME_CHECKNAMES		0x0002		/* Used by rdata. */#define DNS_NAME_CHECKNAMESFAIL		0x0004		/* Used by rdata. */#define DNS_NAME_CHECKREVERSE		0x0008		/* Used by rdata. */LIBDNS_EXTERNAL_DATA extern dns_name_t *dns_rootname;LIBDNS_EXTERNAL_DATA extern dns_name_t *dns_wildcardname;/* * Standard size of a wire format name */#define DNS_NAME_MAXWIRE 255/*** *** Initialization ***/voiddns_name_init(dns_name_t *name, unsigned char *offsets);/* * Initialize 'name'. * * Notes: *	'offsets' is never required to be non-NULL, but specifying a *	dns_offsets_t for 'offsets' will improve the performance of most *	name operations if the name is used more than once. * * Requires: *	'name' is not NULL and points to a struct dns_name. * *	offsets == NULL or offsets is a dns_offsets_t. * * Ensures: *	'name' is a valid name. *	dns_name_countlabels(name) == 0 *	dns_name_isabsolute(name) == ISC_FALSE */voiddns_name_reset(dns_name_t *name);/* * Reinitialize 'name'. * * Notes: *	This function distinguishes itself from dns_name_init() in two *	key ways: * *	+ If any buffer is associated with 'name' (via dns_name_setbuffer() *	  or by being part of a dns_fixedname_t) the link to the buffer *	  is retained but the buffer itself is cleared. * *	+ Of the attributes associated with 'name', all are retained except *	  DNS_NAMEATTR_ABSOLUTE. * * Requires: *	'name' is a valid name. * * Ensures: *	'name' is a valid name. *	dns_name_countlabels(name) == 0 *	dns_name_isabsolute(name) == ISC_FALSE */voiddns_name_invalidate(dns_name_t *name);/* * Make 'name' invalid. * * Requires: *	'name' is a valid name. * * Ensures: *	If assertion checking is enabled, future attempts to use 'name' *	without initializing it will cause an assertion failure. * *	If the name had a dedicated buffer, that association is ended. *//*** *** Dedicated Buffers ***/voiddns_name_setbuffer(dns_name_t *name, isc_buffer_t *buffer);/* * Dedicate a buffer for use with 'name'. * * Notes: *	Specification of a target buffer in dns_name_fromwire(), *	dns_name_fromtext(), and dns_name_concatentate() is optional if *	'name' has a dedicated buffer. * *	The caller must not write to buffer until the name has been *	invalidated or is otherwise known not to be in use. * *	If buffer is NULL and the name previously had a dedicated buffer, *	than that buffer is no longer dedicated to use with this name. *	The caller is responsible for ensuring that the storage used by *	the name remains valid. * * Requires: *	'name' is a valid name. * *	'buffer' is a valid binary buffer and 'name' doesn't have a *	dedicated buffer already, or 'buffer' is NULL. */isc_boolean_tdns_name_hasbuffer(const dns_name_t *name);/* * Does 'name' have a dedicated buffer? * * Requires: *	'name' is a valid name. * * Returns: *	ISC_TRUE	'name' has a dedicated buffer. *	ISC_FALSE	'name' does not have a dedicated buffer. *//*** *** Properties ***/isc_boolean_tdns_name_isabsolute(const dns_name_t *name);/* * Does 'name' end in the root label? * * Requires: *	'name' is a valid name * * Returns: *	TRUE		The last label in 'name' is the root label. *	FALSE		The last label in 'name' is not the root label. */isc_boolean_tdns_name_iswildcard(const dns_name_t *name);/* * Is 'name' a wildcard name? * * Requires: *	'name' is a valid name * *	dns_name_countlabels(name) > 0 * * Returns: *	TRUE		The least significant label of 'name' is '*'. *	FALSE		The least significant label of 'name' is not '*'. */unsigned intdns_name_hash(dns_name_t *name, isc_boolean_t case_sensitive);/* * Provide a hash value for 'name'. * * Note: if 'case_sensitive' is ISC_FALSE, then names which differ only in * case will have the same hash value. * * Requires: *	'name' is a valid name * * Returns: *	A hash value */unsigned intdns_name_fullhash(dns_name_t *name, isc_boolean_t case_sensitive);/* * Provide a hash value for 'name'.  Unlike dns_name_hash(), this function * always takes into account of the entire name to calculate the hash value. * * Note: if 'case_sensitive' is ISC_FALSE, then names which differ only in * case will have the same hash value. * * Requires: *	'name' is a valid name * * Returns: *	A hash value */unsigned intdns_name_hashbylabel(dns_name_t *name, isc_boolean_t case_sensitive);/* * Provide a hash value for 'name', where the hash value is the sum * of the hash values of each label. * * Note: if 'case_sensitive' is ISC_FALSE, then names which differ only in * case will have the same hash value. * * Requires: *	'name' is a valid name * * Returns: *	A hash value *//*** *** Comparisons ***/dns_namereln_tdns_name_fullcompare(const dns_name_t *name1, const dns_name_t *name2,		     int *orderp, unsigned int *nlabelsp);/* * Determine the relative ordering under the DNSSEC order relation of * 'name1' and 'name2', and also determine the hierarchical * relationship of the names. * * Note: It makes no sense for one of the names to be relative and the * other absolute.  If both names are relative, then to be meaningfully * compared the caller must ensure that they are both relative to the * same domain. * * Requires: *	'name1' is a valid name * *	dns_name_countlabels(name1) > 0 * *	'name2' is a valid name * *	dns_name_countlabels(name2) > 0 * *	orderp and nlabelsp are valid pointers. * *	Either name1 is absolute and name2 is absolute, or neither is. * * Ensures: * *	*orderp is < 0 if name1 < name2, 0 if name1 = name2, > 0 if *	name1 > name2. * *	*nlabelsp is the number of common significant labels. * * Returns: *	dns_namereln_none		There's no hierarchical relationship *					between name1 and name2. *	dns_namereln_contains		name1 properly contains name2; i.e. *					name2 is a proper subdomain of name1. *	dns_namereln_subdomain		name1 is a proper subdomain of name2. *	dns_namereln_equal		name1 and name2 are equal. *	dns_namereln_commonancestor	name1 and name2 share a common *					ancestor. */intdns_name_compare(const dns_name_t *name1, const dns_name_t *name2);/* * Determine the relative ordering under the DNSSEC order relation of * 'name1' and 'name2'. * * Note: It makes no sense for one of the names to be relative and the * other absolute.  If both names are relative, then to be meaningfully * compared the caller must ensure that they are both relative to the * same domain. * * Requires: *	'name1' is a valid name * *	'name2' is a valid name * *	Either name1 is absolute and name2 is absolute, or neither is. * * Returns: *	< 0		'name1' is less than 'name2' *	0		'name1' is equal to 'name2' *	> 0		'name1' is greater than 'name2' */

⌨️ 快捷键说明

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