summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/dynamic.h2
-rw-r--r--src/modules.cpp4
-rw-r--r--src/modules/extra/m_mysql.cpp9
-rw-r--r--src/modules/extra/m_pgsql.cpp23
-rw-r--r--src/modules/extra/m_sqlite3.cpp62
5 files changed, 41 insertions, 59 deletions
diff --git a/include/dynamic.h b/include/dynamic.h
index 19ff7bdaf..ec09675e0 100644
--- a/include/dynamic.h
+++ b/include/dynamic.h
@@ -17,7 +17,7 @@
/** The DLLManager class is able to load a module file by filename,
* and locate its init_module symbol.
*/
-class CoreExport DLLManager
+class CoreExport DLLManager : public classbase
{
protected:
diff --git a/src/modules.cpp b/src/modules.cpp
index 67c90b128..db41a757a 100644
--- a/src/modules.cpp
+++ b/src/modules.cpp
@@ -561,8 +561,8 @@ bool ModuleManager::Unload(const char* filename)
ServerInstance->Parser->RemoveCommands(modfind->second.second);
- delete modfind->second.second;
- delete modfind->second.first;
+ ServerInstance->GlobalCulls.AddItem(modfind->second.second);
+ ServerInstance->GlobalCulls.AddItem(modfind->second.first);
Modules.erase(modfind);
ServerInstance->Logs->Log("MODULE", DEFAULT,"Module %s unloaded",filename);
diff --git a/src/modules/extra/m_mysql.cpp b/src/modules/extra/m_mysql.cpp
index 023ead94b..a0ac9ffac 100644
--- a/src/modules/extra/m_mysql.cpp
+++ b/src/modules/extra/m_mysql.cpp
@@ -671,9 +671,9 @@ class ModuleSQL;
class DispatcherThread : public SocketThread
{
private:
- ModuleSQL* Parent;
+ ModuleSQL* const Parent;
public:
- DispatcherThread(ModuleSQL* CreatorModule) : SocketThread(Instance), Parent(CreatorModule),{ }
+ DispatcherThread(ModuleSQL* CreatorModule) : Parent(CreatorModule) { }
~DispatcherThread() { }
virtual void Run();
virtual void OnNotify();
@@ -684,7 +684,6 @@ ModuleSQL::ModuleSQL() : rehashing(false)
ServerInstance->Modules->UseInterface("SQLutils");
Conf = new ConfigReader;
- PublicServerInstance = ServerInstance;
currid = 0;
Dispatcher = new DispatcherThread(this);
@@ -769,7 +768,7 @@ Version ModuleSQL::GetVersion()
void DispatcherThread::Run()
{
- LoadDatabases(Parent->Conf, Parent->PublicServerInstance, Parent);
+ LoadDatabases(Parent->Conf, Parent);
SQLConnection* conn = NULL;
@@ -779,7 +778,7 @@ void DispatcherThread::Run()
if (Parent->rehashing)
{
Parent->rehashing = false;
- LoadDatabases(Parent->Conf, Parent->PublicServerInstance, Parent);
+ LoadDatabases(Parent->Conf, Parent);
}
conn = NULL;
diff --git a/src/modules/extra/m_pgsql.cpp b/src/modules/extra/m_pgsql.cpp
index c0d301107..c0b2bbac8 100644
--- a/src/modules/extra/m_pgsql.cpp
+++ b/src/modules/extra/m_pgsql.cpp
@@ -91,10 +91,9 @@ std::string SQLhost::GetDSN()
class ReconnectTimer : public Timer
{
private:
- Module* mod;
+ Module* const mod;
public:
- ReconnectTimer(Module* m)
- : Timer(5, SI->Time(), false), mod(m)
+ ReconnectTimer(Module* m) : Timer(5, ServerInstance->Time(), false), mod(m)
{
}
virtual void Tick(time_t TIME);
@@ -313,7 +312,7 @@ class SQLConn : public EventHandler
SQLConn(Module* self, const SQLhost& hi)
: EventHandler(), confhost(hi), us(self), sql(NULL), status(CWRITE), qinprog(false)
{
- idle = this->ServerInstance->Time();
+ idle = ServerInstance->Time();
if(!DoConnect())
{
ServerInstance->Logs->Log("m_pgsql",DEFAULT, "WARNING: Could not connect to database with id: " + ConvToStr(hi.id));
@@ -366,7 +365,7 @@ class SQLConn : public EventHandler
if(this->fd <= -1)
return false;
- if (!this->ServerInstance->SE->AddFd(this))
+ if (!ServerInstance->SE->AddFd(this, FD_WANT_NO_WRITE | FD_WANT_NO_READ))
{
ServerInstance->Logs->Log("m_pgsql",DEBUG, "BUG: Couldn't add pgsql socket to socket engine");
return false;
@@ -381,15 +380,17 @@ class SQLConn : public EventHandler
switch(PQconnectPoll(sql))
{
case PGRES_POLLING_WRITING:
- ServerInstance->SE->WantWrite(this);
+ ServerInstance->SE->ChangeEventMask(this, FD_WANT_POLL_WRITE | FD_WANT_NO_READ);
status = CWRITE;
return true;
case PGRES_POLLING_READING:
+ ServerInstance->SE->ChangeEventMask(this, FD_WANT_POLL_READ | FD_WANT_NO_WRITE);
status = CREAD;
return true;
case PGRES_POLLING_FAILED:
return false;
case PGRES_POLLING_OK:
+ ServerInstance->SE->ChangeEventMask(this, FD_WANT_POLL_READ | FD_WANT_NO_WRITE);
status = WWRITE;
return DoConnectedPoll();
default:
@@ -411,7 +412,7 @@ class SQLConn : public EventHandler
/* We just read stuff from the server, that counts as it being alive
* so update the idle-since time :p
*/
- idle = this->ServerInstance->Time();
+ idle = ServerInstance->Time();
if (PQisBusy(sql))
{
@@ -495,15 +496,17 @@ class SQLConn : public EventHandler
switch(PQresetPoll(sql))
{
case PGRES_POLLING_WRITING:
- ServerInstance->SE->WantWrite(this);
+ ServerInstance->SE->ChangeEventMask(this, FD_WANT_POLL_WRITE | FD_WANT_NO_READ);
status = CWRITE;
return DoPoll();
case PGRES_POLLING_READING:
+ ServerInstance->SE->ChangeEventMask(this, FD_WANT_POLL_READ | FD_WANT_NO_WRITE);
status = CREAD;
return true;
case PGRES_POLLING_FAILED:
return false;
case PGRES_POLLING_OK:
+ ServerInstance->SE->ChangeEventMask(this, FD_WANT_POLL_READ | FD_WANT_NO_WRITE);
status = WWRITE;
return DoConnectedPoll();
default:
@@ -732,11 +735,11 @@ class SQLConn : public EventHandler
void Close()
{
- if (!this->ServerInstance->SE->DelFd(this))
+ if (!ServerInstance->SE->DelFd(this))
{
if (sql && PQstatus(sql) == CONNECTION_BAD)
{
- this->ServerInstance->SE->DelFd(this, true);
+ ServerInstance->SE->DelFd(this, true);
}
else
{
diff --git a/src/modules/extra/m_sqlite3.cpp b/src/modules/extra/m_sqlite3.cpp
index 063113102..806cbce72 100644
--- a/src/modules/extra/m_sqlite3.cpp
+++ b/src/modules/extra/m_sqlite3.cpp
@@ -51,28 +51,25 @@ class ResultNotifier : public BufferedSocket
ModuleSQLite3* mod;
public:
- ResultNotifier(ModuleSQLite3* m, int newfd, char* ip) : BufferedSocket(SI, newfd, ip), mod(m)
+ ResultNotifier(ModuleSQLite3* m, int newfd) : BufferedSocket(newfd), mod(m)
{
}
- virtual bool OnDataReady()
+ void OnDataReady()
{
- char data = 0;
- if (ServerInstance->SE->Recv(this, &data, 1, 0) > 0)
- {
- Dispatch();
- return true;
- }
- return false;
+ recvq.clear();
+ Dispatch();
}
+ void OnError(BufferedSocketError) {}
+
void Dispatch();
};
class SQLiteListener : public ListenSocketBase
{
ModuleSQLite3* Parent;
- irc::sockets::insp_sockaddr sock_us;
+ irc::sockets::sockaddrs sock_us;
socklen_t uslen;
FileReader* index;
@@ -86,19 +83,17 @@ class SQLiteListener : public ListenSocketBase
}
}
- virtual void OnAcceptReady(const std::string &ipconnectedto, int nfd, const std::string &incomingip)
+ void OnAcceptReady(int nfd)
{
- new ResultNotifier(this->Parent, this->ServerInstance, nfd, (char *)ipconnectedto.c_str()); // XXX unsafe casts suck
+ new ResultNotifier(Parent, nfd);
}
- /* Using getsockname and ntohs, we can determine which port number we were allocated */
int GetPort()
{
-#ifdef IPV6
- return ntohs(sock_us.sin6_port);
-#else
- return ntohs(sock_us.sin_port);
-#endif
+ int port = 0;
+ std::string addr;
+ irc::sockets::satoap(&sock_us, addr, port);
+ return port;
}
};
@@ -502,27 +497,16 @@ class SQLConn : public classbase
{
if (QueueFD < 0)
{
- if ((QueueFD = socket(AF_FAMILY, SOCK_STREAM, 0)) == -1)
+ if ((QueueFD = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
/* crap, we're out of sockets... */
return;
}
- irc::sockets::insp_sockaddr addr;
-
-#ifdef IPV6
- irc::sockets::insp_aton("::1", &addr.sin6_addr);
- addr.sin6_family = AF_FAMILY;
- addr.sin6_port = htons(listener->GetPort());
-#else
- irc::sockets::insp_inaddr ia;
- irc::sockets::insp_aton("127.0.0.1", &ia);
- addr.sin_family = AF_FAMILY;
- addr.sin_addr = ia;
- addr.sin_port = htons(listener->GetPort());
-#endif
-
- if (connect(QueueFD, (sockaddr*)&addr,sizeof(addr)) == -1)
+ irc::sockets::sockaddrs addr;
+ irc::sockets::aptosa("127.0.0.1", listener->GetPort(), &addr);
+
+ if (connect(QueueFD, &addr.sa, sa_size(addr)) == -1)
{
/* wtf, we cant connect to it, but we just created it! */
return;
@@ -553,11 +537,7 @@ class ModuleSQLite3 : public Module
}
/* Create a socket on a random port. Let the tcp stack allocate us an available port */
-#ifdef IPV6
- listener = new SQLiteListener(this, ServerInstance, 0, "::1");
-#else
- listener = new SQLiteListener(this, ServerInstance, 0, "127.0.0.1");
-#endif
+ listener = new SQLiteListener(this, 0, "127.0.0.1");
if (listener->GetFd() == -1)
{
@@ -582,7 +562,6 @@ class ModuleSQLite3 : public Module
ClearAllConnections();
ServerInstance->SE->DelFd(listener);
- ServerInstance->BufferedSocketCull();
if (QueueFD >= 0)
{
@@ -594,9 +573,10 @@ class ModuleSQLite3 : public Module
{
ServerInstance->SE->DelFd(notifier);
notifier->Close();
- ServerInstance->BufferedSocketCull();
}
+ ServerInstance->GlobalCulls.Apply();
+
ServerInstance->Modules->UnpublishInterface("SQL", this);
ServerInstance->Modules->UnpublishFeature("SQL");
ServerInstance->Modules->DoneWithInterface("SQLutils");