class DNSRequest
{
public:
- unsigned char id[2]; /* Request id */
- unsigned char* res; /* Result processing buffer */
+ unsigned char id[2]; /* Request id */
+ unsigned char* res; /* Result processing buffer */
unsigned int rr_class; /* Request class */
- QueryType type; /* Request type */
+ QueryType type; /* Request type */
insp_inaddr myserver; /* DNS server address*/
- DNS* dnsobj; /* DNS caller (where we get our FD from) */
+ DNS* dnsobj; /* DNS caller (where we get our FD from) */
DNSRequest(InspIRCd* Instance, DNS* dns, insp_inaddr server, int id, requestlist &requests);
~DNSRequest();
res = new unsigned char[512];
*res = 0;
memcpy(&myserver, &server, sizeof(insp_inaddr));
- RequestTimeout* RT = new RequestTimeout(Instance->Config->dns_timeout, Instance, this, id, requests);
+ RequestTimeout* RT = new RequestTimeout(Instance->Config->dns_timeout ? Instance->Config->dns_timeout : 5, Instance, this, id, requests);
Instance->Timers->AddTimer(RT); /* The timer manager frees this */
}
int length;
#ifdef IPV6
- DNS::MakeIP6Int(query, (in6_addr*)ip);
+ unsigned char* c = (unsigned char*)&ip->s6_addr;
+ if (c[0] == 0 && c[1] == 0 && c[2] == 0 && c[3] == 0 &&
+ c[4] == 0 && c[5] == 0 && c[6] == 0 && c[7] == 0 &&
+ c[8] == 0 && c[9] == 0 && c[10] == 0xFF && c[11] == 0xFF)
+ sprintf(query,"%d.%d.%d.%d.in-addr.arpa",c[15],c[14],c[13],c[12]);
+ else
+ DNS::MakeIP6Int(query, (in6_addr*)ip);
#else
unsigned char* c = (unsigned char*)&ip->s_addr;
-
sprintf(query,"%d.%d.%d.%d.in-addr.arpa",c[3],c[2],c[1],c[0]);
#endif
int curanswer, o;
ResourceRecord rr;
unsigned short ptr;
-
+
+ /* This is just to keep _FORTIFY_SOURCE happy */
+ rr.type = DNS_QUERY_NONE;
+ rr.rdlength = 0;
+
if (!(header.flags1 & FLAGS_MASK_QR))
return std::make_pair((unsigned char*)NULL,"Not a query result");
}
/** High level abstraction of dns used by application at large */
-Resolver::Resolver(InspIRCd* Instance, const std::string &source, QueryType qt) : ServerInstance(Instance), input(source), querytype(qt)
+Resolver::Resolver(InspIRCd* Instance, const std::string &source, QueryType qt, Module* creator) : ServerInstance(Instance), Creator(creator), input(source), querytype(qt)
{
ServerInstance->Log(DEBUG,"Instance: %08x %08x",Instance, ServerInstance);
return this->myid;
}
+Module* Resolver::GetCreator()
+{
+ return this->Creator;
+}
+
/** Process a socket read event */
-void DNS::HandleEvent(EventType et)
+void DNS::HandleEvent(EventType et, int errornum)
{
ServerInstance->Log(DEBUG,"Marshall reads: %d",this->GetFd());
/* Fetch the id and result of the next available packet */
}
}
+void DNS::CleanResolvers(Module* module)
+{
+ for (int i = 0; i < MAX_REQUEST_ID; i++)
+ {
+ if (Classes[i])
+ {
+ if (Classes[i]->GetCreator() == module)
+ {
+ Classes[i]->OnError(RESLOVER_FORCEUNLOAD, "Parent module is unloading");
+ delete Classes[i];
+ Classes[i] = NULL;
+ }
+ }
+ }
+}
+
/** Generate pseudo-random number */
unsigned long DNS::PRNG()
{