00001  00002  00003  00004  00005  00006  00007  00008  00009  00010  00011  00012  00013  00014  00015  00016  00017  00018  00019  00020 00021 
#ifndef __POSLIB_DNSMESSAGE_H 00022 
#define __POSLIB_DNSMESSAGE_H 00023 
 00024 
class message_buff; 00025 00026 
#include "dnsdefs.h" 00027 
#include "types.h" 00028 
#include "sysstl.h" 00029 
#include "domainfn.h" 00030 00031  00032  00033 
00050 class message_buff { 00051 
public: 00063 
message_buff(
char *_msg, 
int _len, 
bool is_dynamic = 
false); 00072 
message_buff(
const message_buff& buff); 00080 
message_buff(); 00087 
~message_buff(); 00095 
message_buff& 
operator=(
const message_buff& buff); 
00103 bool is_static; 
00109 int len; 
00115 char *
msg; 00116 }; 00117 
00124 class DnsQuestion { 00125 
public: 00131 
DnsQuestion(); 00138 
DnsQuestion(
const DnsQuestion& q); 00145 
DnsQuestion& 
operator=(
const DnsQuestion& q); 00146 00156 
DnsQuestion(
domainname QNAME, 
u_int16 QTYPE, 
u_int16 QCLASS = 
CLASS_IN); 00157 00163 
~DnsQuestion(); 00164 
00170 domainname QNAME; 00171 
00179 u_int16 QTYPE; 
00189 u_int16 QCLASS; 00190 }; 00191 
00199 class DnsRR { 00200 
public: 00206 
DnsRR(); 00207 00218 
DnsRR(
domainname NAME, 
u_int16 TYPE, 
u_int16 CLASS, 
u_int32 TTL); 00219 00232 
DnsRR(
domainname NAME, 
u_int16 TYPE, 
u_int16 CLASS, 
u_int32 TTL, uint16_t 
RDLENGTH, 
const char *
RDATA); 00233 00241 
DnsRR(
const DnsRR& rr); 00242 00249 
DnsRR& 
operator=(
const DnsRR& rr); 00250 00256 
~DnsRR(); 00257 
00264 domainname NAME; 00265 
00272 u_int16 TYPE; 00273 
00280 u_int16 CLASS; 00281 
00288 u_int32 TTL; 00289 
00295 u_int16 RDLENGTH; 00296 
00304 char *RDATA; 00305 }; 00306 
00314 class DnsMessage { 00315 
public: 00321 
DnsMessage(); 00322 00328 
~DnsMessage(); 00329 
00339 u_int16 ID; 00340 
00346 bool QR; 00347 
00355 u_int4 OPCODE; 00356 
00365 bool AA; 00366 
00374 bool TC; 00375 
00383 bool RD; 00384 
00392 bool RA; 00393 
00401 u_int3 Z; 00402 
00411 u_int4 RCODE; 00412 00419 
stl_list(
DnsQuestion) questions; 00420 00427 stl_list(
DnsRR) answers; 00428 00436 stl_list(
DnsRR) authority; 00437 00445 stl_list(
DnsRR) additional; 00446 00455 
void read_from_data(
char *data, 
int len); 00456 00468 
message_buff compile(
int maxlen); 00469 00470 protected: 00471 
void write_section(stl_list(
DnsRR)& section, 
int lenpos, stl_string& message, stl_slist(
dom_compr_info) &comprinfo, 
int maxlen, 
bool is_additional = false); 00472 
void read_section(stl_list(
DnsRR)& section, 
int count, 
message_buff &buff, 
int &pos); 00473 }; 00474 00475 u_int16 uint16_value(
char *buff); 00476 
u_int32 uint32_value(
char *buff); 00477 00478 
char *uint16_buff(uint16_t val); 00479 
char *uint32_buff(uint32_t val); 00480 00495 
DnsMessage *create_query(
domainname QNAME, uint16_t QTYPE = DNS_TYPE_A, 
bool RD = true, uint16_t QCLASS = CLASS_IN); 00496 00497 
00503 class 
a_record { 00504 
public: 
00505 char address[4]; 00506 }; 00507 00509 
a_record get_a_record(
DnsMessage *a); 00511 
stl_list(
a_record) get_a_records(
DnsMessage *a, 
bool fail_if_none = false); 00512 
00518 class 
aaaa_record { 00519 
public: 
00520 char address[16]; 00521 }; 00522 00524 
aaaa_record get_aaaa_record(
DnsMessage *a); 00526 
stl_list(
aaaa_record) get_aaaa_records(
DnsMessage *a, 
bool fail_if_none = false); 00527 
00533 class 
mx_record { 00534 
public: 
00535 uint16_t preference; 
00536 domainname server; 00537 }; 00538 00540 
mx_record get_mx_record(
DnsMessage *a); 00542 
stl_list(
mx_record) get_mx_records(
DnsMessage *a, 
bool fail_if_none = false); 00543 00545 
domainname get_ns_record(
DnsMessage *a); 00547 stl_list(
domainname) get_ns_records(
DnsMessage *a, 
bool fail_if_none = false); 00548 00550 
domainname get_ptr_record(
DnsMessage *a); 00551  00552 stl_list(
domainname) get_ptr_records(
DnsMessage *a, 
bool fail_if_none = false); 00553 00554  00555 class rrdat { 00556 
public: 00557 rrdat(uint16_t, uint16_t, 
char *); 00558 uint16_t type; 00559 uint16_t len; 00560 
char *msg; 00561 }; 00562 00564 
stl_list(rrdat) get_records(
DnsMessage *a, 
bool fail_if_none = false, 
bool follow_cname = true, stl_list(
domainname) *followed_cnames = NULL); 00565 
00567 enum _answer_type { 00568 A_ERROR, 00569 
A_CNAME, 00570 
A_NXDOMAIN, 00571 
A_ANSWER, 00572 
A_REFERRAL, 00573 
A_NODATA 00574 }; 00575 00577 
_answer_type check_answer_type(
DnsMessage *msg, 
domainname &qname, uint16_t qtype); 00578 00580 
bool has_rrset(
stl_list(
DnsRR) &rrlist, 
domainname &QNAME, uint16_t QTYPE = QTYPE_ANY); 00581 00582 
#endif  00583