summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/inspircd.conf.example26
-rw-r--r--include/connection.h4
-rw-r--r--include/globals.h2
-rw-r--r--include/inspircd.h9
-rw-r--r--include/modules.h17
-rw-r--r--src/InspIRCd.layout68
-rw-r--r--src/connection.cpp37
-rw-r--r--src/inspircd.cpp319
-rw-r--r--src/modules.cpp13
-rw-r--r--src/modules/m_cloaking.cpp2
-rw-r--r--src/modules/m_foobar.cpp8
11 files changed, 298 insertions, 207 deletions
diff --git a/docs/inspircd.conf.example b/docs/inspircd.conf.example
index 3402a2c60..34316ab71 100644
--- a/docs/inspircd.conf.example
+++ b/docs/inspircd.conf.example
@@ -55,15 +55,28 @@
# #
# bind address - specifies which the address which ports bind #
# port - opens an unused port #
+# type - can be 'clients' or 'servers'. The clients type is #
+# a standard tcp based socket, the servers type is a #
+ UDP based connection. #
+# default - if the port type is 'servers' then this can be #
+# specified. If set to 'yes', it indicates that this #
+# port is the default route for all /connect commands.#
+# if you do not bind your default route to an #
+# external ip, or all ip's, you may have connection #
+# problems. #
# #
# Leaving address empty binds to all available interfaces #
# #
# Syntax is as follows: #
-# <bind address="ip number" port="port number"> #
+# #
+# <bind address="ip number" port="port" type="clients"> #
+# <bind address="ip number" port="port" type="servers"> #
+# <bind address="ip number" port="port" type="servers" default="yes"> #
# #
-<bind address="" port="6667">
-<bind address="" port="7000">
+<bind address="" port="6660" type="clients">
+<bind address="" port="7000" type="servers" default="yes">
+<bind address="" port="7001" type="servers">
#-#-#-#-#-#-#-#-#-#- DIE/RESTART CONFIGURATION -#-#-#-#-#-#-#-#-#-#-
@@ -189,15 +202,16 @@
# Settings to define which features are useable on your server. #
# #
# prefixquit - a prefix for a client's quit message #
-# debug - provides an in-depth log file, #
-# this should not need to be enabled #
+# loglevel - specifies what detail of messages to log in the #
+# log file. You may select from debug, verbose, #
+# default, sparse and none. #
# allowhalfop - allows the +h channel mode #
# allowprotect - allows the +a channel mode #
# allowfounder - allows the +q channel mode #
# #
<options prefixquit="Quit: "
- debug="off"
+ loglevel="default"
allowhalfop="yes"
allowprotect="yes"
allowfounder="yes">
diff --git a/include/connection.h b/include/connection.h
index 94b657288..763b17fb5 100644
--- a/include/connection.h
+++ b/include/connection.h
@@ -56,11 +56,11 @@ class connection : public classbase
time_t nping;
connection();
- bool CreateListener(char* host, int port);
+ bool CreateListener(char* host, int p);
bool BeginLink(char* targethost, int port, char* password);
void TerminateLink(char* targethost);
bool SendPacket(char *message, char* host, int port);
- bool RecvPacket(char *message, char* host, int &port);
+ bool RecvPacket(char *message, char* host, int &prt);
bool SendSYN(char* host, int port);
bool SendACK(char* host, int port, int reply_id);
long GenKey();
diff --git a/include/globals.h b/include/globals.h
index a640dfe9b..07c32303f 100644
--- a/include/globals.h
+++ b/include/globals.h
@@ -19,7 +19,7 @@
typedef deque<string> file_cache;
void WriteOpers(char* text, ...);
-void debug(char *text, ...);
+void log(int level, char *text, ...);
void Write(int sock,char *text, ...);
void WriteServ(int sock, char* text, ...);
void WriteFrom(int sock, userrec *user,char* text, ...);
diff --git a/include/inspircd.h b/include/inspircd.h
index 1e1582723..03a5e168e 100644
--- a/include/inspircd.h
+++ b/include/inspircd.h
@@ -38,9 +38,14 @@
#define TRUE 1
#define FALSE 0
#define IDENTMAX 9
-/* max sockets we can open */
#define MAXSOCKS 64
+#define DEBUG 10
+#define VERBOSE 20
+#define DEFAULT 30
+#define SPARSE 40
+#define NONE 50
+
typedef deque<string> file_cache;
/* prototypes */
@@ -52,7 +57,7 @@ void ReadConfig(void);
void strlower(char *n);
void WriteOpers(char* text, ...);
-void debug(char *text, ...);
+void log(int level, char *text, ...);
void Write(int sock,char *text, ...);
void WriteServ(int sock, char* text, ...);
void WriteFrom(int sock, userrec *user,char* text, ...);
diff --git a/include/modules.h b/include/modules.h
index c2896f4cb..9b750e599 100644
--- a/include/modules.h
+++ b/include/modules.h
@@ -90,6 +90,12 @@ class Module : public classbase
* and the details of the channel they have left is available in the variable chanrec *channel
*/
virtual void OnUserPart(userrec* user, chanrec* channel);
+
+
+ virtual void Module::OnPacketTransmit(char *p);
+ virtual void Module::OnPacketReceive(char *p);
+ virtual void OnRehash();
+
};
@@ -114,11 +120,11 @@ class Server : public classbase
* This method sends a server notice to all opers with the usermode +s.
*/
virtual void SendOpers(string s);
- /** Sends a debug string.
- * This method writes a line of text to the debug log. If debugging is disabled
- * in the configuration, this command has no effect.
+ /** Writes a log string.
+ * This method writes a line of text to the log. If the level given is lower than the
+ * level given in the configuration, this command has no effect.
*/
- virtual void Debug(string s);
+ virtual void Log(int level, string s);
/** Sends a line of text down a TCP/IP socket.
* This method writes a line of text to an established socket, cutting it to 510 characters
* plus a carriage return and linefeed if required.
@@ -305,4 +311,7 @@ class ModuleFactory : public classbase
virtual Module * CreateModule() = 0;
};
+
+typedef DLLFactory<ModuleFactory> ircd_module;
+
#endif
diff --git a/src/InspIRCd.layout b/src/InspIRCd.layout
index 22b91c7aa..fb50a441f 100644
--- a/src/InspIRCd.layout
+++ b/src/InspIRCd.layout
@@ -1,5 +1,5 @@
[Editors]
-Focused=-1
+Focused=1
Order=7,1,2,3,4,5,6,0,-1
[Editor_0]
@@ -12,10 +12,10 @@ LeftChar=1
[Editor_1]
Open=1
-Top=0
-CursorCol=3
-CursorRow=4057
-TopLine=4016
+Top=1
+CursorCol=27
+CursorRow=326
+TopLine=307
LeftChar=1
[Editor_2]
@@ -37,9 +37,9 @@ LeftChar=1
[Editor_4]
Open=1
Top=0
-CursorCol=1
-CursorRow=33
-TopLine=1
+CursorCol=5
+CursorRow=57
+TopLine=21
LeftChar=1
[Editor_5]
@@ -67,27 +67,27 @@ TopLine=1
LeftChar=1
[Editor_8]
-Open=0
+Open=1
Top=0
CursorCol=1
CursorRow=1
-TopLine=1
+TopLine=35
LeftChar=1
[Editor_9]
-Open=0
+Open=1
Top=0
-CursorCol=1
+CursorCol=17
CursorRow=1
TopLine=1
LeftChar=1
[Editor_10]
-Open=0
+Open=1
Top=0
-CursorCol=1
-CursorRow=1
-TopLine=1
+CursorCol=12
+CursorRow=42
+TopLine=25
LeftChar=1
[Editor_11]
@@ -99,7 +99,7 @@ TopLine=1
LeftChar=1
[Editor_12]
-Open=1
+Open=0
Top=0
CursorCol=1
CursorRow=1
@@ -107,7 +107,7 @@ TopLine=1
LeftChar=1
[Editor_13]
-Open=1
+Open=0
Top=0
CursorCol=1
CursorRow=71
@@ -123,7 +123,7 @@ TopLine=1
LeftChar=1
[Editor_15]
-Open=1
+Open=0
Top=0
CursorCol=1
CursorRow=1
@@ -131,19 +131,19 @@ TopLine=1
LeftChar=1
[Editor_16]
-Open=0
+Open=1
Top=0
-CursorCol=1
-CursorRow=3
+CursorCol=21
+CursorRow=22
TopLine=1
LeftChar=1
[Editor_17]
Open=1
Top=0
-CursorCol=1
-CursorRow=72
-TopLine=32
+CursorCol=9
+CursorRow=60
+TopLine=30
LeftChar=1
[Editor_18]
@@ -163,18 +163,18 @@ TopLine=1
LeftChar=1
[Editor_20]
-Open=0
+Open=1
Top=0
-CursorCol=1
-CursorRow=1
-TopLine=1
+CursorCol=17
+CursorRow=125
+TopLine=113
LeftChar=1
[Editor_21]
Open=1
Top=0
CursorCol=1
-CursorRow=29
+CursorRow=1
TopLine=1
LeftChar=1
@@ -196,8 +196,8 @@ LeftChar=1
[Editor_24]
Open=1
-Top=1
-CursorCol=15
-CursorRow=238
-TopLine=200
+Top=0
+CursorCol=1
+CursorRow=1
+TopLine=1
LeftChar=1
diff --git a/src/connection.cpp b/src/connection.cpp
index 1d79a00a1..6592cfd10 100644
--- a/src/connection.cpp
+++ b/src/connection.cpp
@@ -5,6 +5,12 @@
#include <sys/ioctl.h>
#include <sys/utsname.h>
#include "inspircd.h"
+#include "modules.h"
+
+extern vector<Module*> modules;
+extern vector<ircd_module*> factory;
+
+extern int MODCOUNT;
packet::packet()
{
@@ -23,11 +29,13 @@ connection::connection()
}
-bool connection::CreateListener(char* host, int port)
+bool connection::CreateListener(char* host, int p)
{
sockaddr_in host_address;
int flags;
in_addr addy;
+ int on = 0;
+ struct linger linger = { 0 };
fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (fd <= 0)
@@ -49,9 +57,9 @@ bool connection::CreateListener(char* host, int port)
host_address.sin_addr = addy;
}
- host_address.sin_port = htons(port);
+ host_address.sin_port = htons(p);
- if (bind(fd, (sockaddr*)&host_address, sizeof(host_address))<0)
+ if (bind(fd,(sockaddr*)&host_address,sizeof(host_address))<0)
{
return false;
}
@@ -60,6 +68,13 @@ bool connection::CreateListener(char* host, int port)
flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
+ this->port = p;
+
+ setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(const char*)&on,sizeof(on));
+ linger.l_onoff = 1;
+ linger.l_linger = 0;
+ setsockopt(fd,SOL_SOCKET,SO_LINGER,(const char*)&linger,sizeof(linger));
+
return true;
}
@@ -102,6 +117,9 @@ bool connection::SendPacket(char *message, char* host, int port)
p.type = PT_SYN_WITH_DATA;
p.key = key;
+
+ FOREACH_MOD OnPacketTransmit(p.data);
+
// returns false if the packet could not be sent (e.g. target host down)
if (sendto(fd,&p,sizeof(p),0,(sockaddr*)&host_address,sizeof(host_address))<0)
{
@@ -195,7 +213,7 @@ long connection::GenKey()
// host: in dot notation a.b.c.d
// port: host byte order
-bool connection::RecvPacket(char *message, char* host, int &port)
+bool connection::RecvPacket(char *message, char* host, int &prt)
{
// returns false if no packet waiting for receive, e.g. EAGAIN or ECONNRESET
sockaddr_in host_address;
@@ -216,8 +234,8 @@ bool connection::RecvPacket(char *message, char* host, int &port)
{
strcpy(message,p.data);
strcpy(host,inet_ntoa(host_address.sin_addr));
- port = ntohs(host_address.sin_port);
- SendACK(host,port,p.id);
+ prt = ntohs(host_address.sin_port);
+ SendACK(host,this->port,p.id);
return false;
}
@@ -225,8 +243,7 @@ bool connection::RecvPacket(char *message, char* host, int &port)
{
strcpy(message,p.data);
strcpy(host,inet_ntoa(host_address.sin_addr));
- port = ntohs(host_address.sin_port);
- SendACK(host,port,p.id);
+ prt = ntohs(host_address.sin_port);
return false;
}
@@ -234,8 +251,8 @@ bool connection::RecvPacket(char *message, char* host, int &port)
{
strcpy(message,p.data);
strcpy(host,inet_ntoa(host_address.sin_addr));
- port = ntohs(host_address.sin_port);
- SendACK(host,port,p.id);
+ prt = ntohs(host_address.sin_port);
+ SendACK(host,this->port,p.id);
}
return true;
diff --git a/src/inspircd.cpp b/src/inspircd.cpp
index 33fa511c2..5db3184b9 100644
--- a/src/inspircd.cpp
+++ b/src/inspircd.cpp
@@ -45,6 +45,7 @@
using namespace std;
+int LogLevel = DEFAULT;
char ServerName[MAXBUF];
char Network[MAXBUF];
char ServerDesc[MAXBUF];
@@ -59,12 +60,16 @@ char list[MAXBUF];
char PrefixQuit[MAXBUF];
char DieValue[MAXBUF];
int debugging = 0;
-int MODCOUNT = -1;
int WHOWAS_STALE = 48; // default WHOWAS Entries last 2 days before they go 'stale'
int WHOWAS_MAX = 100; // default 100 people maximum in the WHOWAS list
int DieDelay = 5;
time_t startup_time = time(NULL);
+extern vector<Module*> modules;
+extern vector<ircd_module*> factory;
+
+extern int MODCOUNT;
+
template<> struct hash<in_addr>
{
size_t operator()(const struct in_addr &a) const
@@ -123,9 +128,8 @@ typedef hash_map<string, userrec*, hash<string>, StrHashComp> user_hash;
typedef hash_map<string, chanrec*, hash<string>, StrHashComp> chan_hash;
typedef hash_map<in_addr,string*, hash<in_addr>, InAddr_HashComp> address_cache;
typedef deque<command_t> command_table;
-typedef DLLFactory<ModuleFactory> ircd_module;
-serverrec* me;
+serverrec* me[32];
server_list* servers;
user_hash clientlist;
@@ -135,13 +139,14 @@ command_table cmdlist;
file_cache MOTD;
file_cache RULES;
address_cache IP;
-vector<Module*> modules(255);
-vector<ircd_module*> factory(255);
+
ClassVector Classes;
struct linger linger = { 0 };
char bannerBuffer[MAXBUF];
int boundPortCount = 0;
+int portCount = 0, UDPportCount = 0, ports[MAXSOCKS];
+int defaultRoute = 0;
/* prototypes */
@@ -158,13 +163,13 @@ void safedelete(userrec *p)
{
if (p)
{
- debug("deleting %s %s %s %s",p->nick,p->ident,p->dhost,p->fullname);
- debug("safedelete(userrec*): pointer is safe to delete");
+ log(DEBUG,"deleting %s %s %s %s",p->nick,p->ident,p->dhost,p->fullname);
+ log(DEBUG,"safedelete(userrec*): pointer is safe to delete");
delete p;
}
else
{
- debug("safedelete(userrec*): unsafe pointer operation squished");
+ log(DEBUG,"safedelete(userrec*): unsafe pointer operation squished");
}
}
@@ -173,11 +178,11 @@ void safedelete(chanrec *p)
if (p)
{
delete p;
- debug("safedelete(chanrec*): pointer is safe to delete");
+ log(DEBUG,"safedelete(chanrec*): pointer is safe to delete");
}
else
{
- debug("safedelete(chanrec*): unsafe pointer operation squished");
+ log(DEBUG,"safedelete(chanrec*): unsafe pointer operation squished");
}
}
@@ -226,7 +231,7 @@ string getadminnick()
return AdminNick;
}
-void debug(char *text, ...)
+void log(int level,char *text, ...)
{
char textbuffer[MAXBUF];
va_list argsPtr;
@@ -234,11 +239,12 @@ void debug(char *text, ...)
time_t rawtime;
struct tm * timeinfo;
+ if (level < LogLevel)
+ return;
+
time(&rawtime);
timeinfo = localtime (&rawtime);
- if (debugging)
- {
f = fopen("ircd.log","a+");
if (f)
{
@@ -256,7 +262,6 @@ void debug(char *text, ...)
printf("Can't write log file, bailing!!!");
Exit(ERROR);
}
- }
}
void readfile(file_cache &F, const char* fname)
@@ -264,7 +269,7 @@ void readfile(file_cache &F, const char* fname)
FILE* file;
char linebuf[MAXBUF];
- debug("readfile: loading %s",fname);
+ log(DEBUG,"readfile: loading %s",fname);
F.clear();
file = fopen(fname,"r");
if (file)
@@ -286,9 +291,9 @@ void readfile(file_cache &F, const char* fname)
}
else
{
- debug("readfile: failed to load file: %s",fname);
+ log(DEBUG,"readfile: failed to load file: %s",fname);
}
- debug("readfile: loaded %s, %d lines",fname,F.size());
+ log(DEBUG,"readfile: loaded %s, %d lines",fname,F.size());
}
void ReadConfig(void)
@@ -309,16 +314,19 @@ void ReadConfig(void)
ConfValue("power","restartpass",0,restartpass);
ConfValue("options","prefixquit",0,PrefixQuit);
ConfValue("die","value",0,DieValue);
- ConfValue("options","debug",0,dbg);
- debugging = 0;
- if (!strcmp(dbg,"on"))
- {
- debugging = 1;
- }
- DieDelay = atoi(pauseval);
- readfile(MOTD,motd);
+ ConfValue("options","loglevel",0,dbg);
+ if (!strcmp(dbg,"debug"))
+ LogLevel = DEBUG;
+ if (!strcmp(dbg,"verbose"))
+ LogLevel = VERBOSE;
+ if (!strcmp(dbg,"default"))
+ LogLevel = DEFAULT;
+ if (!strcmp(dbg,"sparse"))
+ LogLevel = SPARSE;
+ if (!strcmp(dbg,"none"))
+ LogLevel = NONE;
readfile(RULES,rules);
- debug("Reading connect classes");
+ log(DEBUG,"Reading connect classes");
Classes.clear();
for (int i = 0; i < ConfValueEnum("connect"); i++)
{
@@ -332,7 +340,7 @@ void ReadConfig(void)
ConfValue("connect","password",i,Value);
strcpy(c.pass,Value);
Classes.push_back(c);
- debug("Read connect class type ALLOW, host=%s password=%s",c.host,c.pass);
+ log(DEBUG,"Read connect class type ALLOW, host=%s password=%s",c.host,c.pass);
}
else
{
@@ -340,7 +348,7 @@ void ReadConfig(void)
strcpy(c.host,Value);
c.type = CC_DENY;
Classes.push_back(c);
- debug("Read connect class type DENY, host=%s",c.host);
+ log(DEBUG,"Read connect class type DENY, host=%s",c.host);
}
}
@@ -349,7 +357,7 @@ void ReadConfig(void)
void Blocking(int s)
{
int flags;
- debug("Blocking: %d",s);
+ log(DEBUG,"Blocking: %d",s);
flags = fcntl(s, F_GETFL, 0);
fcntl(s, F_SETFL, flags ^ O_NONBLOCK);
}
@@ -357,7 +365,7 @@ void Blocking(int s)
void NonBlocking(int s)
{
int flags;
- debug("NonBlocking: %d",s);
+ log(DEBUG,"NonBlocking: %d",s);
flags = fcntl(s, F_GETFL, 0);
fcntl(s, F_SETFL, flags | O_NONBLOCK);
}
@@ -727,7 +735,7 @@ void purge_empty_chans(void)
/* kill the record */
if (i != chanlist.end())
{
- debug("del_channel: destroyed: %s",i->second->name);
+ log(DEBUG,"del_channel: destroyed: %s",i->second->name);
delete i->second;
chanlist.erase(i);
go_again = 1;
@@ -738,7 +746,7 @@ void purge_empty_chans(void)
}
}
}
- debug("completed channel purge, killed %d",purge);
+ log(DEBUG,"completed channel purge, killed %d",purge);
}
/* returns the status character for a given user on a channel, e.g. @ for op,
@@ -817,7 +825,7 @@ char* chanmodes(chanrec *chan)
sprintf(foo," %d",chan->limit);
strcat(scratch,foo);
}
- debug("chanmodes: %s %s",chan->name,scratch);
+ log(DEBUG,"chanmodes: %s %s",chan->name,scratch);
return scratch;
}
@@ -913,7 +921,7 @@ int usercount_i(chanrec *c)
}
}
}
- debug("usercount_i: %s %d",c->name,count);
+ log(DEBUG,"usercount_i: %s %d",c->name,count);
return count;
}
@@ -934,7 +942,7 @@ int usercount(chanrec *c)
}
}
}
- debug("usercount: %s %d",c->name,count);
+ log(DEBUG,"usercount: %s %d",c->name,count);
return count;
}
@@ -957,7 +965,7 @@ chanrec* add_channel(userrec *user, char* cname, char* key)
cname[CHANMAX-1] = '\0';
}
- debug("add_channel: %s %s",user->nick,cname);
+ log(DEBUG,"add_channel: %s %s",user->nick,cname);
if ((has_channel(user,FindChan(cname))) && (FindChan(cname)))
{
@@ -967,7 +975,7 @@ chanrec* add_channel(userrec *user, char* cname, char* key)
if (!FindChan(cname))
{
/* create a new one */
- debug("add_channel: creating: %s",cname);
+ log(DEBUG,"add_channel: creating: %s",cname);
{
chanlist[cname] = new chanrec();
@@ -979,7 +987,7 @@ chanrec* add_channel(userrec *user, char* cname, char* key)
strncpy(chanlist[cname]->setby, user->nick,NICKMAX);
chanlist[cname]->topicset = 0;
Ptr = chanlist[cname];
- debug("add_channel: created: %s",cname);
+ log(DEBUG,"add_channel: created: %s",cname);
/* set created to 2 to indicate user
* is the first in the channel
* and should be given ops */
@@ -992,22 +1000,22 @@ chanrec* add_channel(userrec *user, char* cname, char* key)
Ptr = FindChan(cname);
if (Ptr)
{
- debug("add_channel: joining to: %s",Ptr->name);
+ log(DEBUG,"add_channel: joining to: %s",Ptr->name);
if (strcmp(Ptr->key,""))
{
- debug("add_channel: %s has key %s",Ptr->name,Ptr->key);
+ log(DEBUG,"add_channel: %s has key %s",Ptr->name,Ptr->key);
if (!key)
{
- debug("add_channel: no key given in JOIN");
+ log(DEBUG,"add_channel: no key given in JOIN");
WriteServ(user->fd,"475 %s %s :Cannot join channel (Requires key)",user->nick, Ptr->name);
return NULL;
}
else
{
- debug("key at %p is %s",key,key);
+ log(DEBUG,"key at %p is %s",key,key);
if (strcasecmp(key,Ptr->key))
{
- debug("add_channel: bad key given in JOIN");
+ log(DEBUG,"add_channel: bad key given in JOIN");
WriteServ(user->fd,"475 %s %s :Cannot join channel (Incorrect key)",user->nick, Ptr->name);
return NULL;
}
@@ -1082,7 +1090,7 @@ chanrec* add_channel(userrec *user, char* cname, char* key)
return Ptr;
}
}
- debug("add_channel: user channel max exceeded: %s %s",user->nick,cname);
+ log(DEBUG,"add_channel: user channel max exceeded: %s %s",user->nick,cname);
WriteServ(user->fd,"405 %s %s :You are on too many channels",user->nick, cname);
return NULL;
}
@@ -1109,7 +1117,7 @@ chanrec* del_channel(userrec *user, char* cname, char* reason)
}
FOREACH_MOD OnUserPart(user,Ptr);
- debug("del_channel: removing: %s %s",user->nick,Ptr->name);
+ log(DEBUG,"del_channel: removing: %s %s",user->nick,Ptr->name);
for (i =0; i != MAXCHANS; i++)
{
@@ -1126,7 +1134,7 @@ chanrec* del_channel(userrec *user, char* cname, char* reason)
}
user->chans[i].uc_modes = 0;
user->chans[i].channel = NULL;
- debug("del_channel: unlinked: %s %s",user->nick,Ptr->name);
+ log(DEBUG,"del_channel: unlinked: %s %s",user->nick,Ptr->name);
break;
}
}
@@ -1136,12 +1144,12 @@ chanrec* del_channel(userrec *user, char* cname, char* reason)
{
chan_hash::iterator iter = chanlist.find(Ptr->name);
- debug("del_channel: destroying channel: %s",Ptr->name);
+ log(DEBUG,"del_channel: destroying channel: %s",Ptr->name);
/* kill the record */
if (iter != chanlist.end())
{
- debug("del_channel: destroyed: %s",Ptr->name);
+ log(DEBUG,"del_channel: destroyed: %s",Ptr->name);
delete iter->second;
chanlist.erase(iter);
}
@@ -1159,7 +1167,7 @@ void kick_channel(userrec *src,userrec *user, chanrec *Ptr, char* reason)
return;
}
- debug("kick_channel: removing: %s %s %s",user->nick,Ptr->name,src->nick);
+ log(DEBUG,"kick_channel: removing: %s %s %s",user->nick,Ptr->name,src->nick);
if (!has_channel(user,Ptr))
{
@@ -1188,7 +1196,7 @@ void kick_channel(userrec *src,userrec *user, chanrec *Ptr, char* reason)
WriteChannel(Ptr,src,"KICK %s %s :%s",Ptr->name, user->nick, reason);
user->chans[i].uc_modes = 0;
user->chans[i].channel = NULL;
- debug("del_channel: unlinked: %s %s",user->nick,Ptr->name);
+ log(DEBUG,"del_channel: unlinked: %s %s",user->nick,Ptr->name);
break;
}
}
@@ -1198,12 +1206,12 @@ void kick_channel(userrec *src,userrec *user, chanrec *Ptr, char* reason)
{
chan_hash::iterator iter = chanlist.find(Ptr->name);
- debug("del_channel: destroying channel: %s",Ptr->name);
+ log(DEBUG,"del_channel: destroying channel: %s",Ptr->name);
/* kill the record */
if (iter != chanlist.end())
{
- debug("del_channel: destroyed: %s",Ptr->name);
+ log(DEBUG,"del_channel: destroyed: %s",Ptr->name);
delete iter->second;
chanlist.erase(iter);
}
@@ -1270,7 +1278,7 @@ int give_ops(userrec *user,char *dest,chanrec *chan,int status)
return 0;
}
d->chans[i].uc_modes = d->chans[i].uc_modes | UCMODE_OP;
- debug("gave ops: %s %s",d->chans[i].channel->name,d->nick);
+ log(DEBUG,"gave ops: %s %s",d->chans[i].channel->name,d->nick);
}
}
}
@@ -1317,7 +1325,7 @@ int give_hops(userrec *user,char *dest,chanrec *chan,int status)
return 0;
}
d->chans[i].uc_modes = d->chans[i].uc_modes | UCMODE_HOP;
- debug("gave h-ops: %s %s",d->chans[i].channel->name,d->nick);
+ log(DEBUG,"gave h-ops: %s %s",d->chans[i].channel->name,d->nick);
}
}
}
@@ -1364,7 +1372,7 @@ int give_voice(userrec *user,char *dest,chanrec *chan,int status)
return 0;
}
d->chans[i].uc_modes = d->chans[i].uc_modes | UCMODE_VOICE;
- debug("gave voice: %s %s",d->chans[i].channel->name,d->nick);
+ log(DEBUG,"gave voice: %s %s",d->chans[i].channel->name,d->nick);
}
}
}
@@ -1411,7 +1419,7 @@ int take_ops(userrec *user,char *dest,chanrec *chan,int status)
return 0;
}
d->chans[i].uc_modes ^= UCMODE_OP;
- debug("took ops: %s %s",d->chans[i].channel->name,d->nick);
+ log(DEBUG,"took ops: %s %s",d->chans[i].channel->name,d->nick);
}
}
}
@@ -1458,7 +1466,7 @@ int take_hops(userrec *user,char *dest,chanrec *chan,int status)
return 0;
}
d->chans[i].uc_modes ^= UCMODE_HOP;
- debug("took h-ops: %s %s",d->chans[i].channel->name,d->nick);
+ log(DEBUG,"took h-ops: %s %s",d->chans[i].channel->name,d->nick);
}
}
}
@@ -1505,7 +1513,7 @@ int take_voice(userrec *user,char *dest,chanrec *chan,int status)
return 0;
}
d->chans[i].uc_modes ^= UCMODE_VOICE;
- debug("took voice: %s %s",d->chans[i].channel->name,d->nick);
+ log(DEBUG,"took voice: %s %s",d->chans[i].channel->name,d->nick);
}
}
}
@@ -1561,7 +1569,7 @@ int add_ban(userrec *user,char *dest,chanrec *chan,int status)
c++;
if (c>1)
return 0;
- debug("add_ban: %s %s",chan->name,user->nick);
+ log(DEBUG,"add_ban: %s %s",chan->name,user->nick);
TidyBan(dest);
for (BanList::iterator i = chan->bans.begin(); i != chan->bans.end(); i++)
@@ -1587,7 +1595,7 @@ int take_ban(userrec *user,char *dest,chanrec *chan,int status)
return 0;
}
- debug("del_ban: %s %s",chan->name,user->nick);
+ log(DEBUG,"del_ban: %s %s",chan->name,user->nick);
for (BanList::iterator i = chan->bans.begin(); i != chan->bans.end(); i++)
{
if (!strcasecmp(i->data,dest))
@@ -1617,7 +1625,7 @@ void process_modes(char **parameters,userrec* user,chanrec *chan,int status, int
return;
}
- debug("process_modes: start");
+ log(DEBUG,"process_modes: start");
strcpy(modelist,parameters[1]); /* mode list, e.g. +oo-o */
/* parameters[2] onwards are parameters for
@@ -1625,14 +1633,14 @@ void process_modes(char **parameters,userrec* user,chanrec *chan,int status, int
strcpy(outlist,"+");
mdir = 1;
- debug("process_modes: modelist: %s",modelist);
+ log(DEBUG,"process_modes: modelist: %s",modelist);
for (ptr = 0; ptr < strlen(modelist); ptr++)
{
r = 0;
{
- debug("process_modes: modechar: %c",modelist[ptr]);
+ log(DEBUG,"process_modes: modechar: %c",modelist[ptr]);
switch (modelist[ptr])
{
case '-':
@@ -2319,7 +2327,7 @@ void handle_kick(char **parameters, int pcnt, userrec *user)
void handle_die(char **parameters, int pcnt, userrec *user)
{
- debug("die: %s",user->nick);
+ log(DEBUG,"die: %s",user->nick);
if (!strcmp(parameters[0],diepass))
{
WriteOpers("*** DIE command from %s!%s@%s, terminating...",user->nick,user->ident,user->host);
@@ -2334,7 +2342,7 @@ void handle_die(char **parameters, int pcnt, userrec *user)
void handle_restart(char **parameters, int pcnt, userrec *user)
{
- debug("restart: %s",user->nick);
+ log(DEBUG,"restart: %s",user->nick);
if (!strcmp(parameters[0],restartpass))
{
WriteOpers("*** RESTART command from %s!%s@%s, Pretending to restart till this is finished :D",user->nick,user->ident,user->host);
@@ -2353,12 +2361,12 @@ void kill_link(userrec *user,char* reason)
{
user_hash::iterator iter = clientlist.find(user->nick);
- debug("kill_link: %s '%s'",user->nick,reason);
+ log(DEBUG,"kill_link: %s '%s'",user->nick,reason);
Write(user->fd,"ERROR :Closing link (%s@%s) [%s]",user->ident,user->host,reason);
fdatasync(user->fd);
WriteOpers("*** Client exiting: %s!%s@%s [%s]",user->nick,user->ident,user->host,reason);
FOREACH_MOD OnUserQuit(user);
- debug("closing fd %d",user->fd);
+ log(DEBUG,"closing fd %d",user->fd);
/* bugfix, cant close() a nonblocking socket (sux!) */
WriteCommonExcept(user,"QUIT :%s",reason);
Blocking(user->fd);
@@ -2368,7 +2376,7 @@ void kill_link(userrec *user,char* reason)
if (iter != clientlist.end())
{
- debug("deleting user hash value %p",iter->second);
+ log(DEBUG,"deleting user hash value %p",iter->second);
delete iter->second;
clientlist.erase(iter);
}
@@ -2382,7 +2390,7 @@ void handle_kill(char **parameters, int pcnt, userrec *user)
userrec *u = Find(parameters[0]);
char killreason[MAXBUF];
- debug("kill: %s %s",parameters[0],parameters[1]);
+ log(DEBUG,"kill: %s %s",parameters[0],parameters[1]);
if (u)
{
WriteOpers("*** Local Kill by %s: %s!%s@%s (%s)",user->nick,u->nick,u->ident,u->host,parameters[1]);
@@ -2536,7 +2544,7 @@ void handle_topic(char **parameters, int pcnt, userrec *user)
void send_error(char *s)
{
- debug("send_error: %s",s);
+ log(DEBUG,"send_error: %s",s);
for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
{
WriteServ(i->second->fd,"NOTICE %s :%s",i->second->nick,s);
@@ -2552,7 +2560,7 @@ void Error(int status)
signal (SIGSEGV, SIG_IGN);
signal (SIGURG, SIG_IGN);
signal (SIGKILL, SIG_IGN);
- debug("*** fell down a pothole in the road to perfection ***");
+ log(DEBUG,"*** fell down a pothole in the road to perfection ***");
send_error("Error! Segmentation fault! save meeeeeeeeeeeeee *splat!*");
exit(status);
}
@@ -2560,16 +2568,16 @@ void Error(int status)
int main (int argc, char *argv[])
{
Start();
- debug("*** InspIRCd starting up!");
+ log(DEBUG,"*** InspIRCd starting up!");
if (!CheckConfig())
{
- debug("main: no config");
+ log(DEBUG,"main: no config");
printf("ERROR: Your config file is missing, this IRCd will self destruct in 10 seconds!\n");
Exit(ERROR);
}
if (InspIRCd() == ERROR)
{
- debug("main: daemon function bailed");
+ log(DEBUG,"main: daemon function bailed");
printf("ERROR: could not initialise. Shutting down.\n");
Exit(ERROR);
}
@@ -2592,24 +2600,24 @@ userrec* ReHashNick(char* Old, char* New)
user_hash::iterator newnick;
user_hash::iterator oldnick = clientlist.find(Old);
- debug("ReHashNick: %s %s",Old,New);
+ log(DEBUG,"ReHashNick: %s %s",Old,New);
if (!strcasecmp(Old,New))
{
- debug("old nick is new nick, skipping");
+ log(DEBUG,"old nick is new nick, skipping");
return oldnick->second;
}
if (oldnick == clientlist.end()) return NULL; /* doesnt exist */
- debug("ReHashNick: Found hashed nick %s",Old);
+ log(DEBUG,"ReHashNick: Found hashed nick %s",Old);
clientlist[New] = new userrec();
clientlist[New] = oldnick->second;
/*delete oldnick->second; */
clientlist.erase(oldnick);
- debug("ReHashNick: Nick rehashed as %s",New);
+ log(DEBUG,"ReHashNick: Nick rehashed as %s",New);
return clientlist[New];
}
@@ -2643,20 +2651,20 @@ void AddWhoWas(userrec* u)
{
delete i->second;
i->second = a;
- debug("added WHOWAS entry, purged an old record");
+ log(DEBUG,"added WHOWAS entry, purged an old record");
return;
}
}
}
else
{
- debug("added fresh WHOWAS entry");
+ log(DEBUG,"added fresh WHOWAS entry");
whowas[a->nick] = a;
}
}
else
{
- debug("updated WHOWAS entry");
+ log(DEBUG,"updated WHOWAS entry");
delete iter->second;
iter->second = a;
}
@@ -2690,7 +2698,7 @@ void AddClient(int socket, char* host, int port, bool iscached)
clientlist[tempnick] = new userrec();
NonBlocking(socket);
- debug("AddClient: %d %s %d",socket,host,port);
+ log(DEBUG,"AddClient: %d %s %d",socket,host,port);
clientlist[tempnick]->fd = socket;
@@ -2837,7 +2845,7 @@ char* chlist(userrec *user)
int i = 0;
char cmp[MAXBUF];
- debug("chlist: %s",user->nick);
+ log(DEBUG,"chlist: %s",user->nick);
strcpy(lst,"");
if (!user)
{
@@ -2957,7 +2965,7 @@ void handle_quit(char **parameters, int pcnt, userrec *user)
if (iter != clientlist.end())
{
- debug("deleting user hash value");
+ log(DEBUG,"deleting user hash value");
delete iter->second;
clientlist.erase(iter);
}
@@ -3053,6 +3061,7 @@ void handle_rehash(char **parameters, int pcnt, userrec *user)
{
WriteServ(user->fd,"382 %s %s :Rehashing",user->nick,CONFIG_FILE);
ReadConfig();
+ FOREACH_MOD OnRehash();
WriteOpers("%s is rehashing config file %s",user->nick,CONFIG_FILE);
}
@@ -3158,7 +3167,7 @@ void ConnectUser(userrec *user)
{
user->registered = 7;
user->idle_lastmsg = time(NULL);
- debug("ConnectUser: %s",user->nick);
+ log(DEBUG,"ConnectUser: %s",user->nick);
if (strcmp(Passwd(user),"") && (!user->haspassed))
{
@@ -3444,8 +3453,8 @@ void handle_stats(char **parameters, int pcnt, userrec *user)
void handle_connect(char **parameters, int pcnt, userrec *user)
{
- WriteServ(user->fd,"NOTICE %s :*** Connecting to %s port 7000...",user->nick,parameters[0]);
- if (!me->BeginLink(parameters[0],7000,"password"))
+ WriteServ(user->fd,"NOTICE %s :*** Connecting to %s port %s...",user->nick,parameters[0],parameters[1]);
+ if (!me[defaultRoute]->BeginLink(parameters[0],atoi(parameters[1]),"password"))
{
WriteServ(user->fd,"NOTICE %s :*** Failed to send auth packet to %s!",user->nick,parameters[0]);
}
@@ -3501,32 +3510,32 @@ void handle_nick(char **parameters, int pcnt, userrec *user)
{
if (pcnt < 1)
{
- debug("not enough params for handle_nick");
+ log(DEBUG,"not enough params for handle_nick");
return;
}
if (!parameters[0])
{
- debug("invalid parameter passed to handle_nick");
+ log(DEBUG,"invalid parameter passed to handle_nick");
return;
}
if (!strlen(parameters[0]))
{
- debug("zero length new nick passed to handle_nick");
+ log(DEBUG,"zero length new nick passed to handle_nick");
return;
}
if (!user)
{
- debug("invalid user passed to handle_nick");
+ log(DEBUG,"invalid user passed to handle_nick");
return;
}
if (!user->nick)
{
- debug("invalid old nick passed to handle_nick");
+ log(DEBUG,"invalid old nick passed to handle_nick");
return;
}
if (!strcasecmp(user->nick,parameters[0]))
{
- debug("old nick is new nick, skipping");
+ log(DEBUG,"old nick is new nick, skipping");
return;
}
else
@@ -3563,7 +3572,7 @@ void handle_nick(char **parameters, int pcnt, userrec *user)
strncpy(user->nick, parameters[0],NICKMAX);
- debug("new nick set: %s",user->nick);
+ log(DEBUG,"new nick set: %s",user->nick);
if (user->registered < 3)
user->registered = (user->registered | 2);
@@ -3572,7 +3581,7 @@ void handle_nick(char **parameters, int pcnt, userrec *user)
/* user is registered now, bit 0 = USER command, bit 1 = sent a NICK command */
ConnectUser(user);
}
- debug("exit nickchange: %s",user->nick);
+ log(DEBUG,"exit nickchange: %s",user->nick);
}
int process_parameters(char **command_p,char *parameters)
@@ -3737,13 +3746,13 @@ void process_command(userrec *user, char* cmd)
user->nping = time(NULL) + 120;
if ((items) < cmdlist[i].min_params)
{
- debug("process_command: not enough parameters: %s %s",user->nick,command);
+ log(DEBUG,"process_command: not enough parameters: %s %s",user->nick,command);
WriteServ(user->fd,"461 %s %s :Not enough parameters",user->nick,command);
return;
}
if ((!strchr(user->modes,cmdlist[i].flags_needed)) && (cmdlist[i].flags_needed))
{
- debug("process_command: permission denied: %s %s",user->nick,command);
+ log(DEBUG,"process_command: permission denied: %s %s",user->nick,command);
WriteServ(user->fd,"481 %s :Permission Denied- You do not have the required operator privilages",user->nick);
cmd_found = 1;
return;
@@ -3754,14 +3763,14 @@ void process_command(userrec *user, char* cmd)
{
if ((!isnick(user->nick)) || (user->registered != 7))
{
- debug("process_command: not registered: %s %s",user->nick,command);
+ log(DEBUG,"process_command: not registered: %s %s",user->nick,command);
WriteServ(user->fd,"451 %s :You have not registered",command);
return;
}
}
if ((user->registered == 7) || (!strcmp(command,"USER")) || (!strcmp(command,"NICK")) || (!strcmp(command,"PASS")))
{
- debug("process_command: handler: %s %s %d",user->nick,command,items);
+ log(DEBUG,"process_command: handler: %s %s %d",user->nick,command,items);
if (cmdlist[i].handler_function)
{
/* ikky /stats counters */
@@ -3786,7 +3795,7 @@ void process_command(userrec *user, char* cmd)
}
else
{
- debug("process_command: not registered: %s %s",user->nick,command);
+ log(DEBUG,"process_command: not registered: %s %s",user->nick,command);
WriteServ(user->fd,"451 %s :You have not registered",command);
return;
}
@@ -3797,7 +3806,7 @@ void process_command(userrec *user, char* cmd)
}
if ((!cmd_found) && (user))
{
- debug("process_command: not in table: %s %s",user->nick,command);
+ log(DEBUG,"process_command: not in table: %s %s",user->nick,command);
WriteServ(user->fd,"421 %s %s :Unknown command",user->nick,command);
}
}
@@ -3857,7 +3866,7 @@ void SetupCommandTable(void)
createcommand("PASS",handle_pass,0,1);
createcommand("TRACE",handle_trace,'o',0);
createcommand("WHOWAS",handle_whowas,0,1);
- createcommand("CONNECT",handle_connect,'o',1);
+ createcommand("CONNECT",handle_connect,'o',2);
createcommand("SQUIT",handle_squit,'o',1);
}
@@ -3891,35 +3900,37 @@ void process_buffer(userrec *user)
{
return;
}
- debug("InspIRCd: processing: %s %s",user->nick,cmd);
+ log(DEBUG,"InspIRCd: processing: %s %s",user->nick,cmd);
process_command(user,cmd);
}
+void handle_link_packet(char* udp_msg, char* udp_host, int udp_port, serverrec *serv)
+{
+}
+
int InspIRCd(void)
{
struct sockaddr_in client, server;
- int portCount = 0, ports[MAXSOCKS];
char addrs[MAXBUF][255];
int openSockfd[MAXSOCKS], incomingSockfd, result = TRUE;
socklen_t length;
int count = 0, scanDetectTrigger = TRUE, showBanner = FALSE;
int selectResult = 0;
- char *temp, configToken[MAXBUF], stuff[MAXBUF], Addr[MAXBUF];
+ char *temp, configToken[MAXBUF], stuff[MAXBUF], Addr[MAXBUF], Type[MAXBUF];
char resolvedHost[MAXBUF];
fd_set selectFds;
struct timeval tv;
- int count2;
- debug("InspIRCd: startup: begin");
- debug("$Id$");
- if ((geteuid()) && (getuid()) == 0)
+ log(DEBUG,"InspIRCd: startup: begin");
+ log(DEBUG,"$Id$");
+ if (geteuid() == 0)
{
printf("WARNING!!! You are running an irc server as ROOT!!! DO NOT DO THIS!!!\n\n");
Exit(ERROR);
- debug("InspIRCd: startup: not starting with UID 0!");
+ log(DEBUG,"InspIRCd: startup: not starting with UID 0!");
}
SetupCommandTable();
- debug("InspIRCd: startup: default command table set up");
+ log(DEBUG,"InspIRCd: startup: default command table set up");
ReadConfig();
if (strcmp(DieValue,""))
@@ -3927,20 +3938,42 @@ int InspIRCd(void)
printf("WARNING: %s\n\n",DieValue);
exit(0);
}
- debug("InspIRCd: startup: read config");
+ log(DEBUG,"InspIRCd: startup: read config");
+ int count2 = 0, count3 = 0;
for (count = 0; count < ConfValueEnum("bind"); count++)
{
ConfValue("bind","port",count,configToken);
ConfValue("bind","address",count,Addr);
- ports[count] = atoi(configToken);
- strcpy(addrs[count],Addr);
- debug("InspIRCd: startup: read binding %s:%d from config",addrs[count],ports[count]);
+ ConfValue("bind","type",count,Type);
+ if (!strcmp(Type,"clients"))
+ {
+ ports[count2] = atoi(configToken);
+ strcpy(addrs[count2],Addr);
+ count2++;
+ }
+ else
+ {
+ char Default[MAXBUF];
+ strcpy(Default,"no");
+ ConfValue("bind","default",count,Default);
+ if (strchr(Default,'y'))
+ {
+ defaultRoute = count3;
+ log(DEBUG,"InspIRCd: startup: binding '%s:%s' is default server route",Addr,configToken);
+ }
+ me[count3] = new serverrec(ServerName,100L,false);
+ me[count3]->CreateListener(Addr,atoi(configToken));
+ count3++;
+ }
+ log(DEBUG,"InspIRCd: startup: read binding %s:%s [%s] from config",Addr,configToken, Type);
}
- portCount = ConfValueEnum("bind");
- debug("InspIRCd: startup: read %d total ports",portCount);
+ portCount = count2;
+ UDPportCount = count3;
+
+ log(DEBUG,"InspIRCd: startup: read %d total client ports and %d total server ports",portCount,UDPportCount);
- debug("InspIRCd: startup: InspIRCd is now running!");
+ log(DEBUG,"InspIRCd: startup: InspIRCd is now running!");
printf("\n");
for (count = 0; count < ConfValueEnum("module"); count++)
@@ -3949,12 +3982,12 @@ int InspIRCd(void)
ConfValue("module","name",count,configToken);
sprintf(modfile,"%s/%s",MOD_PATH,configToken);
printf("Loading module... \033[1;37m%s\033[0;37m\n",modfile);
- debug("InspIRCd: startup: Loading module: %s",modfile);
+ log(DEBUG,"InspIRCd: startup: Loading module: %s",modfile);
factory[count] = new ircd_module(modfile);
if (factory[count]->LastError())
{
- debug("Unable to load %s: %s",modfile,factory[count]->LastError());
+ log(DEBUG,"Unable to load %s: %s",modfile,factory[count]->LastError());
sprintf("Unable to load %s: %s\nExiting...\n",modfile,factory[count]->LastError());
Exit(ERROR);
}
@@ -3966,19 +3999,16 @@ int InspIRCd(void)
}
else
{
- debug("Unable to load %s",modfile);
+ log(DEBUG,"Unable to load %s",modfile);
sprintf("Unable to load %s\nExiting...\n",modfile);
Exit(ERROR);
}
}
MODCOUNT = count - 1;
- debug("Total loaded modules: %d",MODCOUNT+1);
+ log(DEBUG,"Total loaded modules: %d",MODCOUNT+1);
- me = new serverrec(ServerName,100L,false);
servers = new server_list;
servers->clear();
-
- me->CreateListener("127.0.0.1",7000);
printf("\nInspIRCd is now running!\n");
@@ -3986,7 +4016,7 @@ int InspIRCd(void)
if (DaemonSeed() == ERROR)
{
- debug("InspIRCd: startup: can't daemonise");
+ log(DEBUG,"InspIRCd: startup: can't daemonise");
printf("ERROR: could not go into daemon mode. Shutting down.\n");
Exit(ERROR);
}
@@ -3994,31 +4024,31 @@ int InspIRCd(void)
/* setup select call */
FD_ZERO(&selectFds);
- debug("InspIRCd: startup: zero selects");
+ log(DEBUG,"InspIRCd: startup: zero selects");
for (count = 0; count < portCount; count++)
{
- if ((openSockfd[boundPortCount] = OpenTCPSocket()) == ERROR)
+ if ((openSockfd[boundPortCount] = OpenTCPSocket()) == ERROR)
{
- debug("InspIRCd: startup: bad fd %d",openSockfd[boundPortCount]);
- return(ERROR);
+ log(DEBUG,"InspIRCd: startup: bad fd %d",openSockfd[boundPortCount]);
+ return(ERROR);
}
if (BindSocket(openSockfd[boundPortCount],client,server,ports[count],addrs[count]) == ERROR)
{
- debug("InspIRCd: startup: failed to bind port %d",ports[count]);
+ log(DEBUG,"InspIRCd: startup: failed to bind port %d",ports[count]);
}
else /* well we at least bound to one socket so we'll continue */
{
- boundPortCount++;
+ boundPortCount++;
}
}
- debug("InspIRCd: startup: total bound ports %d",boundPortCount);
+ log(DEBUG,"InspIRCd: startup: total bound ports %d",boundPortCount);
/* if we didn't bind to anything then abort */
if (boundPortCount == 0)
{
- debug("InspIRCd: startup: no ports bound, bailing!");
+ log(DEBUG,"InspIRCd: startup: no ports bound, bailing!");
return (ERROR);
}
@@ -4048,9 +4078,15 @@ int InspIRCd(void)
tv.tv_sec = 0;
selectResult = select(MAXSOCKS, &selectFds, NULL, NULL, &tv);
- if (me->RecvPacket(udp_msg, udp_host, udp_port))
+ for (int x = 0; x != UDPportCount; x++)
{
- WriteOpers("UDP Link Packet: '%s' from %s:%d",udp_msg,udp_host,udp_port);
+ if (me[x]->RecvPacket(udp_msg, udp_host, udp_port))
+ {
+ FOREACH_MOD OnPacketReceive(udp_msg);
+ WriteOpers("UDP Link Packet: '%s' from %s:%d:%d [route%d]",udp_msg,udp_host,udp_port,me[x]->port,x);
+ // Packets must go back via the route they arrived on :)
+ handle_link_packet(udp_msg, udp_host, udp_port, me[x]);
+ }
}
for (user_hash::iterator count2 = clientlist.begin(); count2 != clientlist.end(); count2++)
@@ -4066,12 +4102,12 @@ int InspIRCd(void)
{
if (!count2->second->lastping)
{
- debug("InspIRCd: ping timeout: %s",count2->second->nick);
+ log(DEBUG,"InspIRCd: ping timeout: %s",count2->second->nick);
kill_link(count2->second,"Ping timeout");
break;
}
Write(count2->second->fd,"PING :%s",ServerName);
- debug("InspIRCd: pinging: %s",count2->second->nick);
+ log(DEBUG,"InspIRCd: pinging: %s",count2->second->nick);
count2->second->lastping = 0;
count2->second->nping = time(NULL)+120;
}
@@ -4084,7 +4120,7 @@ int InspIRCd(void)
else
if (result == 0)
{
- debug("InspIRCd: Exited: %s",count2->second->nick);
+ log(DEBUG,"InspIRCd: Exited: %s",count2->second->nick);
kill_link(count2->second,"Client exited");
}
else if (result > 0)
@@ -4139,12 +4175,12 @@ int InspIRCd(void)
if (incomingSockfd < 0)
{
WriteOpers("*** WARNING: Accept failed on port %d (%s)", ports[count],target);
- debug("InspIRCd: accept failed: %d",ports[count]);
+ log(DEBUG,"InspIRCd: accept failed: %d",ports[count]);
break;
}
AddClient(incomingSockfd, resolved, ports[count], iscached);
- debug("InspIRCd: adding client on port %d fd=%d",ports[count],incomingSockfd);
+ log(DEBUG,"InspIRCd: adding client on port %d fd=%d",ports[count],incomingSockfd);
break;
}
@@ -4156,3 +4192,4 @@ int InspIRCd(void)
close (incomingSockfd);
}
+
diff --git a/src/modules.cpp b/src/modules.cpp
index 1b17a61e2..ad4e00c0a 100644
--- a/src/modules.cpp
+++ b/src/modules.cpp
@@ -30,6 +30,9 @@ void Module::OnUserConnect(userrec* user) { }
void Module::OnUserQuit(userrec* user) { }
void Module::OnUserJoin(userrec* user, chanrec* channel) { }
void Module::OnUserPart(userrec* user, chanrec* channel) { }
+void Module::OnPacketTransmit(char *p) { }
+void Module::OnPacketReceive(char *p) { }
+void Module::OnRehash() { }
Version Module::GetVersion() { return Version(1,0,0,0); }
// server is a wrapper class that provides methods to all of the C-style
@@ -49,9 +52,9 @@ void Server::SendOpers(string s)
WriteOpers("%s",s.c_str());
}
-void Server::Debug(string s)
+void Server::Log(int level, string s)
{
- debug("%s",s.c_str());
+ log(level,"%s",s.c_str());
}
void Server::Send(int Socket, string s)
@@ -214,3 +217,9 @@ int FileReader::FileSize()
}
+vector<Module*> modules(255);
+vector<ircd_module*> factory(255);
+
+int MODCOUNT = -1;
+
+
diff --git a/src/modules/m_cloaking.cpp b/src/modules/m_cloaking.cpp
index 91ab49054..46ed5cfec 100644
--- a/src/modules/m_cloaking.cpp
+++ b/src/modules/m_cloaking.cpp
@@ -39,7 +39,7 @@ class ModuleCloaking : public Module
memcpy(&s2,a.c_str(),sizeof(long));
sprintf(ra,"%.8X",seed*s2*strlen(user->host));
string b = Srv->GetNetworkName() + "-" + ra + a;
- Srv->Debug("cloak: allocated "+b);
+ Srv->Log(DEBUG,"cloak: allocated "+b);
strcpy(user->dhost,b.c_str());
}
}
diff --git a/src/modules/m_foobar.cpp b/src/modules/m_foobar.cpp
index 9aed188d8..0c8907bea 100644
--- a/src/modules/m_foobar.cpp
+++ b/src/modules/m_foobar.cpp
@@ -45,7 +45,7 @@ class ModuleFoobar : public Module
// method called when a user connects
string b = user->nick;
- Srv->Debug("Foobar: User connecting: " + b);
+ Srv->Log(DEBUG,"Foobar: User connecting: " + b);
}
virtual void OnUserQuit(userrec* user)
@@ -53,7 +53,7 @@ class ModuleFoobar : public Module
// method called when a user disconnects
string b = user->nick;
- Srv->Debug("Foobar: User quitting: " + b);
+ Srv->Log(DEBUG,"Foobar: User quitting: " + b);
}
virtual void OnUserJoin(userrec* user, chanrec* channel)
@@ -62,7 +62,7 @@ class ModuleFoobar : public Module
string c = channel->name;
string b = user->nick;
- Srv->Debug("Foobar: User " + b + " joined " + c);
+ Srv->Log(DEBUG,"Foobar: User " + b + " joined " + c);
}
virtual void OnUserPart(userrec* user, chanrec* channel)
@@ -71,7 +71,7 @@ class ModuleFoobar : public Module
string c = channel->name;
string b = user->nick;
- Srv->Debug("Foobar: User " + b + " parted " + c);
+ Srv->Log(DEBUG,"Foobar: User " + b + " parted " + c);
}
};