#include <fstream>
#include <vector>
#include <deque>
-#ifdef THREADED_DNS
-#include <pthread.h>
-#endif
#include "users.h"
#include "ctables.h"
#include "globals.h"
#include "commands.h"
#include "xline.h"
#include "inspstring.h"
-#include "dnsqueue.h"
#include "helperfuncs.h"
#include "hashcomp.h"
#include "socketengine.h"
{
this->Start();
module_sockets.clear();
- init_dns();
this->startup_time = time(NULL);
srand(time(NULL));
log(DEBUG,"*** InspIRCd starting up!");
std::string InspIRCd::GetVersionString()
{
char versiondata[MAXBUF];
-#ifdef THREADED_DNS
- char dnsengine[] = "multithread";
-#else
- char dnsengine[] = "singlethread";
-#endif
+ char dnsengine[] = "singlethread-object";
if (*Config->CustomVersion)
{
snprintf(versiondata,MAXBUF,"%s %s :%s",VERSION,Config->ServerName,Config->CustomVersion);
break;
case X_ESTAB_DNS:
- /* When we are using single-threaded dns,
- * the sockets for dns end up in our mainloop.
- * When we are using multi-threaded dns,
- * each thread has its own basic poll() loop
- * within it, making them 'fire and forget'
- * and independent of the mainloop.
- */
-#ifndef THREADED_DNS
- log(DEBUG,"Type: X_ESTAB_DNS: fd=%d",activefds[activefd]);
- dns_poll(activefds[activefd]);
-#endif
- break;
-
- case X_ESTAB_CLASSDNS:
/* Handles instances of the Resolver class,
- * a simple class extended by modules for
+ * a simple class extended by modules and the core for
* nonblocking resolving of addresses.
*/
-
- dns_deal_with_classes(activefds[activefd]);
+ this->Res->MarshallReads(activefds[activefd]);
break;
case X_LISTEN:
- log(DEBUG,"Type: X_LISTEN_MODULE: fd=%d",activefds[activefd]);
+ log(DEBUG,"Type: X_LISTEN: fd=%d",activefds[activefd]);
/* It's a listener */
uslen = sizeof(sock_us);
if ((incomingSockfd > -1) && (!getsockname(incomingSockfd,(sockaddr*)&sock_us,&uslen)))
{
+#ifdef IPV6
+ in_port = ntohs(sock_us.sin6_port);
+#else
in_port = ntohs(sock_us.sin_port);
+#endif
log(DEBUG,"Accepted socket %d",incomingSockfd);
/* Years and years ago, we used to resolve here
* using gethostbyaddr(). That is sucky and we
{
try
{
- Config->GetIOHook(in_port)->OnRawSocketAccept(incomingSockfd, inet_ntoa(client.sin_addr), in_port);
+#ifdef IPV6
+ Config->GetIOHook(in_port)->OnRawSocketAccept(incomingSockfd, insp_ntoa(client.sin6_addr), in_port);
+#else
+ Config->GetIOHook(in_port)->OnRawSocketAccept(incomingSockfd, insp_ntoa(client.sin_addr), in_port);
+#endif
}
catch (ModuleException& modexcept)
{
}
}
stats->statsAccept++;
+#ifdef IPV6
+ log(DEBUG,"Add ipv6 client");
+ AddClient(incomingSockfd, in_port, false, client.sin6_addr);
+#else
+ log(DEBUG,"Add ipv4 client");
AddClient(incomingSockfd, in_port, false, client.sin_addr);
- log(DEBUG,"Adding client on port %lu fd=%lu",(unsigned long)in_port,(unsigned long)incomingSockfd);
+#endif
+ log(DEBUG,"Adding client on port %d fd=%d",in_port,incomingSockfd);
}
else
{
- log(DEBUG,"Accept failed on fd %lu: %s",(unsigned long)incomingSockfd,strerror(errno));
+ log(DEBUG,"Accept failed on fd %d: %s",incomingSockfd,strerror(errno));
shutdown(incomingSockfd,2);
close(incomingSockfd);
stats->statsRefused++;
{
/* Until THIS point, ServerInstance == NULL */
+ this->Res = new DNS();
+
LoadAllModules(this);
/* Just in case no modules were loaded - fix for bug #101 */
/* Add the listening sockets used for client inbound connections
* to the socket engine
*/
- for (int count = 0; count < stats->BoundPortCount; count++)
+ for (unsigned long count = 0; count < stats->BoundPortCount; count++)
SE->AddFd(Config->openSockfd[count],true,X_LISTEN);
this->WritePID(Config->PID);
int main(int argc, char** argv)
{
- /* TEST SUITE FOR TOKENSTREAM
- *
- * Expected output:
- *
- * String: 'PRIVMSG #test FOO BAR'
- * Token 0 = 'PRIVMSG'
- * Token 1 = '#test'
- * Token 2 = 'FOO'
- * Token 3 = 'BAR'
- * String: 'PRIVMSG #test :FOO BAR BAZ'
- * Token 0 = 'PRIVMSG'
- * Token 1 = '#test'
- * Token 2 = 'FOO BAR BAZ'
- * String: ':PRIVMSG #test :FOO BAR BAZ'
- * Token 0 = ':PRIVMSG'
- * String: 'AAAAAAA'
- * Token 0 = 'AAAAAAA'
- * String: ''
- * NumItems = 0
- *
- std::string a = "PRIVMSG #test FOO BAR";
- printf("String: '%s'\n",a.c_str());
- irc::tokenstream test(a);
- printf("Token 0 = '%s'\n",test.GetToken().c_str());
- printf("Token 1 = '%s'\n",test.GetToken().c_str());
- printf("Token 2 = '%s'\n",test.GetToken().c_str());
- printf("Token 3 = '%s'\n",test.GetToken().c_str());
- printf("Token 4 = '%s'\n",test.GetToken().c_str());
-
- std::string b = "PRIVMSG #test :FOO BAR BAZ";
- printf("String: '%s'\n",b.c_str());
- irc::tokenstream test2(b);
- printf("Token 0 = '%s'\n",test2.GetToken().c_str());
- printf("Token 1 = '%s'\n",test2.GetToken().c_str());
- printf("Token 2 = '%s'\n",test2.GetToken().c_str());
- printf("Token 3 = '%s'\n",test2.GetToken().c_str());
-
- std::string c = ":PRIVMSG #test :FOO BAR BAZ";
- printf("String: '%s'\n",c.c_str());
- irc::tokenstream test3(c);
- printf("Token 0 = '%s'\n",test3.GetToken().c_str());
-
- c = "AAAAAAA";
- printf("String: '%s'\n",c.c_str());
- irc::tokenstream test4(c);
- printf("Token 0 = '%s'\n",test4.GetToken().c_str());
- printf("Token 1 = '%s'\n",test4.GetToken().c_str());
-
- c = "";
- printf("String: '%s'\n",c.c_str());
- irc::tokenstream test5(c);
- printf("Token 0 = '%s'\n",test5.GetToken().c_str());
-
- exit(0);
- */
+ /* This is a MatchCIDR() test suite -
+ printf("Should be 0: %d\n",MatchCIDR("127.0.0.1","1.2.3.4/8"));
+ printf("Should be 1: %d\n",MatchCIDR("127.0.0.1","127.0.0.0/8"));
+ printf("Should be 1: %d\n",MatchCIDR("127.0.0.1","127.0.0.0/18"));
+ printf("Should be 0: %d\n",MatchCIDR("3ffe::0","2fc9::0/16"));
+ printf("Should be 1: %d\n",MatchCIDR("3ffe:1:3::0", "3ffe:1::0/32"));
+ exit(0); */
+
try
{
ServerInstance = new InspIRCd(argc, argv);