mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-31 06:25:31 +00:00
add
This commit is contained in:
138
bin/tests/name_test.c
Normal file
138
bin/tests/name_test.c
Normal file
@@ -0,0 +1,138 @@
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <isc/assertions.h>
|
||||
#include <isc/boolean.h>
|
||||
#include <isc/region.h>
|
||||
|
||||
#include <dns/types.h>
|
||||
#include <dns/result.h>
|
||||
#include <dns/name.h>
|
||||
|
||||
static void
|
||||
print_wirename(isc_region_t name) {
|
||||
unsigned char *ccurr, *cend;
|
||||
|
||||
ccurr = name->base;
|
||||
cend = ccurr + name->length;
|
||||
while (ccurr != cend)
|
||||
printf("%02x ", *ccurr++);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[]) {
|
||||
char s[1000];
|
||||
unsigned char b[255];
|
||||
unsigned char o[255];
|
||||
unsigned char c[255];
|
||||
unsigned int tbytes;
|
||||
dns_result_t result;
|
||||
struct dns_name name, oname, compname;
|
||||
struct isc_region source, target, r;
|
||||
dns_name_t origin, comp;
|
||||
isc_boolean_t downcase = ISC_FALSE;
|
||||
|
||||
argc--;
|
||||
argv++;
|
||||
|
||||
if (argc > 0) {
|
||||
if (strcasecmp("none", argv[0]) == 0)
|
||||
origin = NULL;
|
||||
else {
|
||||
source.base = (unsigned char *)argv[0];
|
||||
source.length = strlen(argv[0]);
|
||||
target.base = o;
|
||||
target.length = 255;
|
||||
result = dns_name_fromtext(&oname, &source,
|
||||
dns_rootname, 0,
|
||||
&target);
|
||||
if (result != 0) {
|
||||
fprintf(stderr,
|
||||
"dns_name_fromtext() failed: %d\n",
|
||||
result);
|
||||
exit(1);
|
||||
}
|
||||
origin = &oname;
|
||||
}
|
||||
} else
|
||||
origin = dns_rootname;
|
||||
|
||||
if (argc > 1) {
|
||||
if (strcasecmp("none", argv[0]) == 0)
|
||||
comp = NULL;
|
||||
else {
|
||||
source.base = (unsigned char *)argv[1];
|
||||
source.length = strlen(argv[1]);
|
||||
target.base = c;
|
||||
target.length = 255;
|
||||
result = dns_name_fromtext(&compname, &source,
|
||||
dns_rootname, 0,
|
||||
&target);
|
||||
if (result != 0) {
|
||||
fprintf(stderr,
|
||||
"dns_name_fromtext() failed: %d\n",
|
||||
result);
|
||||
exit(1);
|
||||
}
|
||||
comp = &compname;
|
||||
}
|
||||
} else
|
||||
comp = NULL;
|
||||
|
||||
while (gets(s) != NULL) {
|
||||
source.base = (unsigned char *)s;
|
||||
source.length = strlen(s);
|
||||
target.base = b;
|
||||
target.length = 255;
|
||||
result = dns_name_fromtext(&name, &source, origin, downcase,
|
||||
&target);
|
||||
if (result == DNS_R_SUCCESS) {
|
||||
dns_name_toregion(&name, &r);
|
||||
#ifndef QUIET
|
||||
print_wirename(&r);
|
||||
printf("%u labels, %u bytes.\n",
|
||||
dns_name_countlabels(&name),
|
||||
r.length);
|
||||
#endif
|
||||
} else
|
||||
printf("%s\n", dns_result_totext(result));
|
||||
|
||||
if (result == 0) {
|
||||
target.base = (unsigned char *)s;
|
||||
target.length = 1000;
|
||||
result = dns_name_totext(&name, 0, &target, &tbytes);
|
||||
if (result == DNS_R_SUCCESS) {
|
||||
printf("%.*s\n", (int)tbytes, s);
|
||||
#ifndef QUIET
|
||||
printf("%u bytes.\n", tbytes);
|
||||
#endif
|
||||
} else
|
||||
printf("%s\n", dns_result_totext(result));
|
||||
}
|
||||
|
||||
#ifndef QUIET
|
||||
if (comp != NULL) {
|
||||
int i;
|
||||
isc_boolean_t b;
|
||||
|
||||
i = dns_name_compare(&name, comp);
|
||||
b = dns_name_issubdomain(&name, comp);
|
||||
if (i < 0)
|
||||
printf("<, ");
|
||||
else if (i > 0)
|
||||
printf(">, ");
|
||||
else
|
||||
printf("=, ");
|
||||
if (!b)
|
||||
printf("not ");
|
||||
printf("subdomain\n");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
499
lib/dns/include/dns/name.h
Normal file
499
lib/dns/include/dns/name.h
Normal file
@@ -0,0 +1,499 @@
|
||||
|
||||
#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 EDNS1 (0)
|
||||
* Draft Binary Labels (2)
|
||||
* Draft Local Compression (1)
|
||||
*
|
||||
*/
|
||||
|
||||
/***
|
||||
*** Imports
|
||||
***/
|
||||
|
||||
#include <isc/boolean.h>
|
||||
|
||||
#include <dns/types.h>
|
||||
|
||||
|
||||
|
||||
/*****
|
||||
***** Labels
|
||||
*****
|
||||
***** A 'label' is basically a region. It contains one DNS wire format
|
||||
***** label of either type 00 (ordinary) or type 01000001 (bitstring).
|
||||
*****/
|
||||
|
||||
#define DNS_LABELTYPE_BITSTRING 0x41
|
||||
|
||||
/***
|
||||
*** Properties
|
||||
***/
|
||||
|
||||
dns_labeltype_t dns_label_type(dns_label_t label);
|
||||
/*
|
||||
* Get the type of 'label'.
|
||||
*
|
||||
* Requires:
|
||||
* 'label' is a valid label (i.e. not NULL, points to a
|
||||
* struct dns_label)
|
||||
* 'label' is a type 00 or type 01000001 label (i.e. not compressed).
|
||||
*
|
||||
* Returns:
|
||||
* dns_labeltype_ordinary type 00 label
|
||||
* dns_labeltype_bitstring type 01000001 label
|
||||
*/
|
||||
|
||||
/***
|
||||
*** Bitstring Labels
|
||||
***/
|
||||
|
||||
unsigned int dns_label_countbits(dns_label_t label);
|
||||
/*
|
||||
* The number of bits in a bitstring label.
|
||||
*
|
||||
* Requires:
|
||||
* 'label' is a valid label
|
||||
*
|
||||
* dns_label_type(label) == dns_labeltype_bitstring
|
||||
*
|
||||
* Ensures:
|
||||
* Result is <= 256.
|
||||
*
|
||||
* Returns:
|
||||
* The number of bits in the bitstring label.
|
||||
*/
|
||||
|
||||
dns_bitlabel_t dns_label_getbit(dns_label_t label, unsigned int n);
|
||||
/*
|
||||
* The 'n'th most significant bit of 'label'.
|
||||
*
|
||||
* Notes:
|
||||
* Numbering starts at 0.
|
||||
*
|
||||
* Require:
|
||||
* n < dns_label_countbits(label)
|
||||
*
|
||||
* Returns:
|
||||
* dns_bitlabel_0 The bit was 0.
|
||||
* dns_bitlabel_1 The bit was 1.
|
||||
*/
|
||||
|
||||
/***
|
||||
*** Note
|
||||
***
|
||||
*** Some provision still needs to be made for splitting bitstring labels,
|
||||
*** and for merging them, but doing either one requires memory in the
|
||||
*** obvious implementation.
|
||||
***
|
||||
*** Perhaps we can simply leave merging to FromWire, and deal with splitting
|
||||
*** by some other, noncopying method. I suspect copying is the way to go,
|
||||
*** however.
|
||||
***/
|
||||
|
||||
|
||||
|
||||
/*****
|
||||
***** Names
|
||||
*****
|
||||
***** A 'name' is a handle to a binary region. It contains a sequence of one
|
||||
***** or more DNS wire format labels of either type 00 (ordinary) or type
|
||||
***** 01000001 (bitstring). Note that all names are not required to end
|
||||
***** with the root label, as they are in the actual DNS wire protocol.
|
||||
*****/
|
||||
|
||||
/***
|
||||
*** Types
|
||||
***/
|
||||
|
||||
/*
|
||||
* Clients are discouraged from using this type directly.
|
||||
*/
|
||||
struct dns_name {
|
||||
unsigned char *ndata;
|
||||
unsigned int length;
|
||||
unsigned int labels;
|
||||
unsigned char offsets[128];
|
||||
};
|
||||
|
||||
extern dns_name_t dns_rootname;
|
||||
|
||||
/***
|
||||
*** Initialization
|
||||
***/
|
||||
|
||||
void dns_name_init(dns_name_t name);
|
||||
/*
|
||||
* Make 'name' empty.
|
||||
*
|
||||
* Requires:
|
||||
* 'name' is a valid name (i.e. not NULL, points to a struct dns_name)
|
||||
*
|
||||
* Ensures:
|
||||
* dns_name_countlabels(name) == 0
|
||||
*/
|
||||
|
||||
|
||||
/***
|
||||
*** Properties
|
||||
***/
|
||||
|
||||
isc_boolean_t dns_name_isabsolute(dns_name_t name);
|
||||
/*
|
||||
* Does 'name' end in the root label?
|
||||
*
|
||||
* Requires:
|
||||
* 'name' is a valid name
|
||||
*
|
||||
* dns_name_countlabels(name) > 0
|
||||
*
|
||||
* Returns:
|
||||
* TRUE The last label in 'name' is the root label.
|
||||
* FALSE The last label in 'name' is not the root label.
|
||||
*/
|
||||
|
||||
|
||||
/***
|
||||
*** Comparisons
|
||||
***/
|
||||
|
||||
int dns_name_compare(dns_name_t name1, dns_name_t name2);
|
||||
/*
|
||||
* Determine the relative ordering under the DNSSEC order relation of
|
||||
* 'name1' and 'name2'.
|
||||
*
|
||||
* Requires:
|
||||
* 'name1' is a valid name
|
||||
*
|
||||
* dns_name_countlabels(name1) > 0
|
||||
*
|
||||
* 'name2' is a valid name
|
||||
*
|
||||
* dns_name_countlabels(name2) > 0
|
||||
*
|
||||
* Returns:
|
||||
* -1 'name1' is less than 'name2'
|
||||
* 0 'name1' is equal to 'name2'
|
||||
* 1 'name1' is greater than 'name2'
|
||||
*/
|
||||
|
||||
isc_boolean_t
|
||||
dns_name_issubdomain(dns_name_t name1, dns_name_t name2);
|
||||
/*
|
||||
* Is 'name1' a subdomain of 'name2'?
|
||||
*
|
||||
* Notes:
|
||||
* name1 is a subdomain of name2 if name1 is contained in name2, or
|
||||
* name1 equals name2.
|
||||
*
|
||||
* 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
|
||||
*
|
||||
* Returns:
|
||||
* TRUE 'name1' is a subdomain of 'name2'
|
||||
* FALSE 'name1' is not a subdomain of 'name2'
|
||||
*/
|
||||
|
||||
|
||||
/***
|
||||
*** Labels
|
||||
***/
|
||||
|
||||
unsigned int dns_name_countlabels(dns_name_t name);
|
||||
/*
|
||||
* How many labels does 'name' have?
|
||||
*
|
||||
* Notes:
|
||||
* In this case, as in other places, a 'label' is an ordinary label
|
||||
* or a bitstring label. The term is not meant to refer to individual
|
||||
* bit labels.
|
||||
*
|
||||
* Requires:
|
||||
* 'name' is a valid name
|
||||
*
|
||||
* Ensures:
|
||||
* The result is <= 128.
|
||||
*
|
||||
* Returns:
|
||||
* The number of labels in 'name'.
|
||||
*/
|
||||
|
||||
void dns_name_getlabel(dns_name_t name, unsigned int n, dns_label_t label);
|
||||
/*
|
||||
* Make 'label' refer to the 'n'th least significant label of 'name'.
|
||||
*
|
||||
* Notes:
|
||||
* Numbering starts at 0.
|
||||
*
|
||||
* Given "rc.vix.com.", the label 0 is "rc", and label 3 is the
|
||||
* root label.
|
||||
*
|
||||
* 'label' refers to the same memory as 'name', so 'name' must not
|
||||
* be changed while 'label' is still in use.
|
||||
*
|
||||
* Requires:
|
||||
* n < dns_label_countlabels(name)
|
||||
*/
|
||||
|
||||
void dns_name_getlabelsequence(dns_name_t source,
|
||||
unsigned int first,
|
||||
unsigned int n,
|
||||
dns_name_t target);
|
||||
/*
|
||||
* Make 'target' refer to the 'n' labels including and following 'first'
|
||||
* in 'source'.
|
||||
*
|
||||
* Notes:
|
||||
* Numbering starts at 0.
|
||||
*
|
||||
* 'target' refers to the same memory as 'source', so 'source'
|
||||
* must not be changed while 'target' is still in use.
|
||||
*
|
||||
* Requires:
|
||||
* first < dns_label_countlabels(name)
|
||||
* first + n <= dns_label_countlabels(name)
|
||||
*/
|
||||
|
||||
/***
|
||||
*** Conversions
|
||||
***/
|
||||
|
||||
void dns_name_fromregion(dns_name_t name, isc_region_t r);
|
||||
/*
|
||||
* Make 'name' refer to region 'r'.
|
||||
*
|
||||
* Requires:
|
||||
* The data in 'r' is a sequence of one or more type 00 or type 01000001
|
||||
* labels.
|
||||
* The length of 'r' is <= 255.
|
||||
*/
|
||||
|
||||
void dns_name_toregion(dns_name_t name, isc_region_t r);
|
||||
/*
|
||||
* Make 'r' refer to 'name'.
|
||||
*
|
||||
* Requires:
|
||||
*
|
||||
* 'name' is a valid name.
|
||||
*
|
||||
* 'r' is a valid region.
|
||||
*/
|
||||
|
||||
dns_result_t dns_name_fromwire(dns_name_t name,
|
||||
isc_region_t source,
|
||||
dns_decompression_t dctx,
|
||||
isc_boolean_t downcase,
|
||||
isc_region_t target);
|
||||
/*
|
||||
* Copy the possibly-compressed name at source into target, decompressing it.
|
||||
*
|
||||
* Notes:
|
||||
* Decompression policy is controlled by 'dctx'.
|
||||
*
|
||||
* If 'downcase' is true, any uppercase letters in 'source' will be
|
||||
* downcased when they are copied into 'target'.
|
||||
*
|
||||
* Security:
|
||||
*
|
||||
* *** WARNING ***
|
||||
*
|
||||
* This routine will often be used when 'source' contains raw network
|
||||
* data. An error in this routine could result in a denial of service,
|
||||
* or in the hijacking of the server.
|
||||
*
|
||||
* Requires:
|
||||
*
|
||||
* 'source' and 'target' are valid regions.
|
||||
*
|
||||
* 'dctx' is a valid decompression context.
|
||||
*
|
||||
* Ensures:
|
||||
*
|
||||
* If result is success:
|
||||
* 'name' is attached to the target.
|
||||
*
|
||||
* Uppercase letters are downcased in the copy iff. 'downcase' is
|
||||
* true.
|
||||
*
|
||||
* Any bitstring labels in source are canonicalized.
|
||||
* (i.e. maximally packed and any padding bits zeroed.)
|
||||
*
|
||||
* Result:
|
||||
* Success
|
||||
* Bad Form: Label Length
|
||||
* Bad Form: Unknown Label Type
|
||||
* Bad Form: Name Length
|
||||
* Bad Form: Local compression not allowed
|
||||
* Bad Form: Compression pointer loop
|
||||
* Bad Form: Input too short
|
||||
* Resource Limit: Too many compression pointers
|
||||
* Resource Limit: Not enough space in buffer
|
||||
*/
|
||||
|
||||
dns_result_t dns_name_towire(dns_name_t name,
|
||||
dns_compression_t cctx,
|
||||
isc_region_t target, unsigned int *bytesp);
|
||||
/*
|
||||
* Convert 'name' into wire format, compressing it as specified by the
|
||||
* compression context 'cctx', and storing the result in 'target'.
|
||||
*
|
||||
* Notes:
|
||||
* If the compression context allows global compression, then the
|
||||
* global compression table may be updated.
|
||||
*
|
||||
* Requires:
|
||||
* 'name' is a valid name
|
||||
*
|
||||
* dns_name_countlabels(name) > 0
|
||||
*
|
||||
* dns_name_isabsolute(name) == TRUE
|
||||
*
|
||||
* target is a valid region
|
||||
*
|
||||
* Any offsets specified in a global compression table are valid
|
||||
* for buffer.
|
||||
*
|
||||
* Ensures:
|
||||
* If the result is success:
|
||||
* Any bitstring labels are in canonical form.
|
||||
*
|
||||
* *bytesp is the number of bytes of the target region that
|
||||
* were used.
|
||||
*
|
||||
* Returns:
|
||||
* Success
|
||||
* Resource Limit: Not enough space in buffer
|
||||
*/
|
||||
|
||||
dns_result_t dns_name_fromtext(dns_name_t name,
|
||||
isc_region_t source,
|
||||
dns_name_t origin,
|
||||
isc_boolean_t downcase,
|
||||
isc_region_t target);
|
||||
/*
|
||||
* Convert the textual representation of a DNS name at source
|
||||
* into uncompressed wire form stored in target.
|
||||
*
|
||||
* Notes:
|
||||
* Relative domain names will have 'origin' appended to them
|
||||
* unless 'origin' is NULL, in which case relative domain names
|
||||
* will remain relative.
|
||||
*
|
||||
* If 'downcase' is true, any uppercase letters in 'source' will be
|
||||
* downcased when they are copied into 'target'.
|
||||
*
|
||||
* Requires:
|
||||
*
|
||||
* 'source' and 'target' are valid regions.
|
||||
* 'name' is a valid name.
|
||||
*
|
||||
* Ensures:
|
||||
* If result is success:
|
||||
* 'name' is attached to the target.
|
||||
*
|
||||
* Any bitstring labels in source are canonicalized.
|
||||
*
|
||||
* Uppercase letters are downcased in the copy iff. 'downcase' is
|
||||
* true.
|
||||
*
|
||||
* The current location in source is advanced, and the used space
|
||||
* in target is updated.
|
||||
*
|
||||
* Result:
|
||||
* Success
|
||||
* Bad Form: Label Length
|
||||
* Bad Form: Unknown Label Type
|
||||
* Bad Form: Name Length
|
||||
* Bad Form: Empty Label
|
||||
* Bad Form: Input too short
|
||||
* Resource Limit: Not enough space in buffer
|
||||
*/
|
||||
|
||||
dns_result_t dns_name_totext(dns_name_t name,
|
||||
isc_boolean_t omit_final_dot,
|
||||
isc_region_t target, unsigned int *bytesp);
|
||||
/*
|
||||
* Convert 'name' into text format, storing the result in 'target'.
|
||||
*
|
||||
* Notes:
|
||||
* If 'omit_final_dot' is true, then the final '.' in an absolute
|
||||
* name will not be emitted.
|
||||
*
|
||||
* Requires:
|
||||
* 'name' is a valid name
|
||||
*
|
||||
* 'target' is a valid buffer
|
||||
*
|
||||
* dns_name_countlabels(name) > 0
|
||||
*
|
||||
* if dns_name_isabsolute == FALSE, then omit_final_dot == FALSE
|
||||
*
|
||||
* Ensures:
|
||||
* If the result is success:
|
||||
* Any bitstring labels are in canonical form.
|
||||
*
|
||||
* *bytesp is the number of bytes of the target region that
|
||||
* were used.
|
||||
*
|
||||
* Returns:
|
||||
* Success
|
||||
* Resource Limit: Not enough space in buffer
|
||||
*/
|
||||
|
||||
#endif /* DNS_NAME_H */
|
26
lib/dns/include/dns/result.h
Normal file
26
lib/dns/include/dns/result.h
Normal file
@@ -0,0 +1,26 @@
|
||||
|
||||
#ifndef DNS_RESULT_H
|
||||
#define DNS_RESULT_H 1
|
||||
|
||||
typedef unsigned int dns_result_t;
|
||||
|
||||
#define DNS_R_SUCCESS 0
|
||||
#define DNS_R_NOMEMORY 1
|
||||
/* Names */
|
||||
#define DNS_R_NOSPACE 2
|
||||
#define DNS_R_LABELTOOLONG 3
|
||||
#define DNS_R_BADESCAPE 4
|
||||
#define DNS_R_BADBITSTRING 5
|
||||
#define DNS_R_BITSTRINGTOOLONG 6
|
||||
#define DNS_R_EMPTYLABEL 7
|
||||
#define DNS_R_BADDOTTEDQUAD 8
|
||||
#define DNS_R_UNEXPECTEDEND 9
|
||||
#define DNS_R_NOTIMPLEMENTED 10
|
||||
|
||||
#define DNS_R_LASTENTRY 10 /* Last entry on list. */
|
||||
|
||||
#define DNS_R_UNEXPECTED 0xFFFFFFFFL
|
||||
|
||||
char * dns_result_totext(dns_result_t);
|
||||
|
||||
#endif /* DNS_RESULT_H */
|
24
lib/dns/include/dns/types.h
Normal file
24
lib/dns/include/dns/types.h
Normal file
@@ -0,0 +1,24 @@
|
||||
|
||||
#ifndef DNS_TYPES_H
|
||||
#define DNS_TYPES_H 1
|
||||
|
||||
#include <isc/region.h>
|
||||
#include <isc/boolean.h>
|
||||
|
||||
typedef isc_region_t dns_label_t;
|
||||
typedef struct dns_name * dns_name_t;
|
||||
typedef struct dns_lex * dns_lex_t;
|
||||
typedef struct dns_compression * dns_compression_t;
|
||||
typedef struct dns_decompression * dns_decompression_t;
|
||||
|
||||
typedef enum {
|
||||
dns_labeltype_ordinary = 0,
|
||||
dns_labeltype_bitstring = 1
|
||||
} dns_labeltype_t;
|
||||
|
||||
typedef enum {
|
||||
dns_bitlabel_0 = 0,
|
||||
dns_bitlabel_1 = 1
|
||||
} dns_bitlabel_t;
|
||||
|
||||
#endif /* DNS_TYPES_H */
|
1266
lib/dns/name.c
Normal file
1266
lib/dns/name.c
Normal file
File diff suppressed because it is too large
Load Diff
25
lib/dns/result.c
Normal file
25
lib/dns/result.c
Normal file
@@ -0,0 +1,25 @@
|
||||
|
||||
#include <dns/result.h>
|
||||
|
||||
static char *text_table[DNS_R_LASTENTRY + 1] = {
|
||||
"success", /* 0 */
|
||||
"out of memory", /* 1 */
|
||||
"ran out of space", /* 2 */
|
||||
"label too long", /* 3 */
|
||||
"bad escape", /* 4 */
|
||||
"bad bitstring", /* 5 */
|
||||
"bitstring too long", /* 6 */
|
||||
"empty label", /* 7 */
|
||||
"bad dotted quad", /* 8 */
|
||||
"unexpected end of input", /* 9 */
|
||||
"not implemented", /* 10 */
|
||||
};
|
||||
|
||||
char *
|
||||
dns_result_totext(dns_result_t result) {
|
||||
if (result == DNS_R_UNEXPECTED)
|
||||
return ("unexpected error");
|
||||
if (result > DNS_R_LASTENTRY)
|
||||
return ("unknown result code");
|
||||
return (text_table[result]);
|
||||
}
|
Reference in New Issue
Block a user