00001
00002
00003 #ifndef _IDNS_H_
00004 #define _IDNS_H_
00005
00007
00008
00009
00010
00011
00012
00013 #define DNS_TYPE_A 1 // Address
00014 #define DNS_TYPE_NS 2 // Auth name server
00015 #define DNS_TYPE_MD 3 // Mail destination
00016 #define DNS_TYPE_MF 4 // Mail forwarder
00017 #define DNS_TYPE_CNAME 5 // Canonical name for an alias
00018 #define DNS_TYPE_SOA 6 // Start of authority
00019 #define DNS_TYPE_MB 7
00020 #define DNS_TYPE_MG 8
00021 #define DNS_TYPE_MR 9
00022 #define DNS_TYPE_NULL 10
00023 #define DNS_TYPE_WKS 11
00024 #define DNS_TYPE_PTR 12
00025 #define DNS_TYPE_HINFO 13
00026 #define DNS_TYPE_MINFO 14
00027 #define DNS_TYPE_MX 15 // Mail exchange
00028 #define DNS_TYPE_TXT 16
00029
00030
00031 #define DNS_QTYPE_AXFR 252 // A request for a transfer of an entire zone
00032 #define DNS_QTYPE_MAILB 253 // A request for mailbox-related records (MB, MG or MR)
00033 #define DNS_QTYPE_MAILA 254 // A request for mail agent RRs (Obsolete - see MX)
00034 #define DNS_QTYPE_ALL 255 // A request for all records
00035
00036
00037 #define DNS_CLASS_IN 1 // The Internet
00038 #define DNS_CLASS_CS 2 // The CSNET class (Obsolete - used only for examples in some obsolete RFCs)
00039 #define DNS_CLASS_CH 3 // The CHAOS class
00040 #define DNS_CLASS_HS 4 // Hesiod [Dyer 87]
00041
00042
00043 #define DNS_QCLASS_ALL 255 // Any class
00044
00045
00046 #define DNS_Q_QUERY 0
00047 #define DNS_Q_IQUERY 1
00048 #define DNS_Q_STATUS 2
00049
00050
00051 #define DNS_R_SUCCESS 0 // No error condition
00052 #define DNS_R_FORMAT_ERROR 1 // The name server was unable to interpret the query.
00053 #define DNS_R_SERVER_FAILED 2 // The name server was unable to process this query due
00054
00055 #define DNS_R_NAME_ERROR 3 // Meaningful only for responses from an authoritative name
00056
00057
00058 #define DNS_R_NOT_IMPL 4 // The name server does not support the requested kind of query.
00059 #define DNS_R_REFUSED 5 // The name server refuses to perform the specified operation.
00060
00061
00062 #define DNS_PORT 53
00063 #define DNS_MY_ID 2
00064 #define DNS_TIMEOUT 10000 // 10s
00065
00067
00068
00069 struct DnsMethods
00070 {
00071 uchar *ReadLabel(void *Header, uchar *s, char *&Label);
00072 uchar *WriteLabel(uchar *s, char *Label);
00073 };
00074
00075
00076 struct DnsHeader
00077 {
00078 uint16 Id;
00079
00080
00081 uint16 RecursionDesired:1;
00082 uint16 IsTruncated:1;
00083 uint16 IsAuthoritative:1;
00084 uint16 QueryType:4;
00085 uint16 IsResponse:1;
00086
00087
00088 uint16 ResponseCode:4;
00089 uint16 Reserved:3;
00090 uint16 RecursionAvailable:1;
00091
00092
00093 uint16 QueryCount;
00094
00095
00096 uint16 ResourceCount;
00097
00098
00099 uint16 NameServerCount;
00100
00101
00102 uint16 AdditionalCount;
00103 };
00104
00105 struct DnsTcpMessage : public DnsMethods
00106 {
00107 uint16 Length;
00108 DnsHeader Header;
00109 uchar Data[4096];
00110 };
00111
00112 struct DnsUdpMessage : public DnsMethods
00113 {
00114 DnsHeader Header;
00115 uchar Data[4096];
00116 };
00117
00119
00120 bool GetDnsServers(GArray<char*> &Servers);
00121 bool IDnsResolve(GArray<char*> &Results, char *Name, int Type = DNS_TYPE_A, int theclass = DNS_CLASS_IN);
00122
00123 #endif