#include "../lib/irc_string.h"
#include "../control/control.h"
#include "../channel/channel.h"
-#include "../pqsql/pqsql.h"
+#include "../dbapi/dbapi.h"
#include "../lib/strlfunc.h"
#include "../lib/version.h"
#include <string.h>
#include <stdlib.h>
-#include <libpq-fe.h>
-MODULE_VERSION("$Id: noperserv_fakeuser.c 663 2006-05-16 17:27:36Z newserv $")
+MODULE_VERSION("");
/* #define SIT_CHANNEL "#qnet.fakeusers" */
#define KILL_WAIT 10
void fakeuser_cleanup();
int fakeuser_loaddb();
-void fakeusers_load(PGconn *dbconn, void *tag);
+void fakeusers_load(DBConn *dbconn, void *tag);
void fakeuser_handler(nick *user, int command, void **params);
int fakeadd(void *sender, int cargc, char **cargv);
int fakelist(void *sender, int cargc, char **cargv);
void _init() {
if (!fakeuser_loaddb())
{
- Error("noperserv_fakeuser", ERR_ERROR, "Cannot load database");
+ Error("noperserv_fakeuser", ERR_FATAL, "Cannot load database");
return;
}
registercontrolhelpcmd("fakeuser", NO_OPER, 4, &fakeadd, "Usage: FAKEUSER nick <ident> <host> <realname>\nCreates a fake user.");
free(killed);
}
fakeusercount = 0;
+ killedusercount = 0;
fakeuserlist = NULL;
killeduserlist = NULL;
}
int fakeuser_loaddb()
+// Called from _init
{
- if (!pqconnected())
+ if (!dbconnected())
return 0;
fakeuser_cleanup();
- pqcreatequery("CREATE TABLE noperserv.fakeusers ("
+ dbcreatequery("CREATE TABLE noperserv.fakeusers ("
"nick VARCHAR(%d) NOT NULL,"
"ident VARCHAR(%d) NOT NULL,"
"host VARCHAR(%d) NOT NULL,"
"realname VARCHAR(%d) NOT NULL,"
"PRIMARY KEY (nick))", NICKLEN, USERLEN, HOSTLEN, REALLEN);
- pqasyncquery(&fakeusers_load, NULL, "SELECT nick, ident, host, realname FROM noperserv.fakeusers");
+ dbasyncquery(&fakeusers_load, NULL, "SELECT nick, ident, host, realname FROM noperserv.fakeusers");
return 1;
}
-void fakeusers_load(PGconn *dbconn, void *tag)
+void fakeusers_load(DBConn *dbconn, void *tag)
+// Called automatically when the async database query finishes
{
- PGresult *pgres = PQgetResult(dbconn);
+ DBResult *pgres = dbgetresult(dbconn);
user_details details;
- int i, rowcount;
- if (PQresultStatus(pgres) != PGRES_TUPLES_OK) {
- Error("noperserv_fakeuser", ERR_ERROR, "Error loading fakeuser list (%d)", PQresultStatus(pgres));
+ if (!dbquerysuccessful(pgres)) {
+ Error("noperserv_fakeuser", ERR_FATAL, "Error loading fakeuser list.");
+ dbclear(pgres);
return;
}
- details.schedule = NULL;
- rowcount = PQntuples(pgres);
- Error("noperserv_fakeuser", ERR_INFO, "Loading %d users", rowcount);
details.lastkill = 0;
-
- for (i = 0; i < rowcount; i++)
- {
- strlcpy(details.nick, PQgetvalue(pgres, i, 0), NICKLEN + 1);
- strlcpy(details.ident, PQgetvalue(pgres, i, 1), USERLEN + 1);
- strlcpy(details.host, PQgetvalue(pgres, i, 2), HOSTLEN + 1);
- strlcpy(details.realname, PQgetvalue(pgres, i, 3), REALLEN + 1);
+ details.schedule = NULL;
+ while(dbfetchrow(pgres)) {
+ strlcpy(details.nick, dbgetvalue(pgres, 0), NICKLEN + 1);
+ strlcpy(details.ident, dbgetvalue(pgres, 1), USERLEN + 1);
+ strlcpy(details.host, dbgetvalue(pgres, 2), HOSTLEN + 1);
+ strlcpy(details.realname, dbgetvalue(pgres, 3), REALLEN + 1);
reconnectfake(&details);
}
+ dbclear(pgres);
}
user_details *getdetails(nick *user)
details = malloc(sizeof(user_details));
if (!details)
return NULL;
- details->schedule = NULL;
strlcpy(details->nick, user->nick, NICKLEN + 1);
strlcpy(details->ident, user->ident, USERLEN + 1);
strlcpy(details->host, user->host->name->content, HOSTLEN + 1);
strlcpy(details->realname, user->realname->name->content, REALLEN + 1);
+ details->schedule = NULL;
details->lastkill = 0;
return details;
}
nick *register_fakeuser(user_details *details)
{
nick *user;
- if((user = getnickbynick(details->nick)) && (IsOper(user) || IsService(user) || IsXOper(user))) {
+ if ((user = getnickbynick(details->nick)) && (IsOper(user) || IsService(user) || IsXOper(user))) {
err_code = ERR_WONTKILL;
return NULL;
}
NULL, UMODE_INV | UMODE_DEAF, &fakeuser_handler);
}
-fakeuser *ll_add(user_details *details) //Adds to the (sorted) linked list
+fakeuser *ll_add(user_details *details)
+// Adds to the (sorted) linked list
{
fakeuser *fake, *newfake;
int cmp;
err_code = ERR_MEM;
return NULL;
}
-
newfake->user = register_fakeuser(details);
if (!newfake->user)
{
free(newfake);
- /* errcode already set by register_fakeuser */
- return NULL;
+ return NULL; //errcode already set by register_fakeuser
}
newfake->lastkill = details->lastkill;
newfake->next = fakeuserlist;
if (!newfake->user)
{
free(newfake);
- /* errcode already set by register_fakeuser */
- return NULL;
+ return NULL; //errcode already set by register_fakeuser
}
newfake->lastkill = details->lastkill;
newfake->next = fake->next;
if (!newfake->user)
{
free(newfake);
- /* errcode already set by register_fakeuser */
- return NULL;
+ return NULL; //errcode already set by register_fakeuser
}
newfake->lastkill = details->lastkill;
newfake->next = NULL;
return newfake;
}
-void kll_add(user_details *details) //Adds to the (sorted) linked list of killed users
+void kll_add(user_details *details)
+//Adds to the (sorted) linked list of killed users
{
int cmp;
user_details *killed;
return;
}
-fakeuser *ll_remove(char *nickname) //Removes from the linked list
+fakeuser *ll_remove(char *nickname)
+//Removes from the linked list
{
fakeuser *fake, *rmfake;
int cmp;
details = getdetails(user);
item = ll_remove(details->nick);
- if(!item)
+ if (!item)
+ {
+ controlwall(NO_OPER, NL_FAKEUSERS, "Error: A fakeuser was killed, but wasn't found in the list");
+ Error("noperserv_fakeuser", ERR_ERROR, "A fakeuser was killed, but wasn't found in the list");
return;
+ }
details->lastkill = item->lastkill;
free(item);
- if(timenow - item->lastkill < KILL_TIME) {
+ if (timenow - details->lastkill < KILL_TIME) {
char escnick[NICKLEN * 2 + 1];
controlwall(NO_OPER, NL_FAKEUSERS, "Fake user %s!%s@%s (%s) KILL'ed twice under in %d seconds. Removing.", details->nick, details->ident, details->host, details->realname, KILL_TIME);
- item = ll_remove(details->nick);
- free(item);
-
- PQescapeString(escnick, details->nick, strlen(details->nick));
- pqquery("DELETE FROM noperserv.fakeusers WHERE nick = '%s'", escnick);
+ dbescapestring(escnick, details->nick, strlen(details->nick));
+ dbquery("DELETE FROM noperserv.fakeusers WHERE nick = '%s'", escnick);
return;
}
details->lastkill = timenow;
if (err_code == ERR_EXISTS)
controlreply(sender, "Error: fakeuser already exists");
else if (err_code == ERR_MEM)
+ {
controlreply(sender, "Error: memory error!!");
+ Error("noperserv_fakeuser", ERR_STOP, "malloc error");
+ }
else if (err_code == ERR_WONTKILL)
controlreply(sender, "Nick already exists and I won't kill it");
else
+ {
controlreply(sender, "Unknown error when adding fakeuser");
+ Error("noperserv_fakeuser", ERR_ERROR, "Unknown error when adding fakeuser");
+ }
return CMD_ERROR;
}
newnick = newfake->user;
- PQescapeString(escnick, newnick->nick, strlen(newnick->nick));
- PQescapeString(escident, newnick->ident, strlen(newnick->ident));
- PQescapeString(eschost, newnick->host->name->content, newnick->host->name->length);
- PQescapeString(escreal, newnick->realname->name->content, newnick->realname->name->length);
+ dbescapestring(escnick, newnick->nick, strlen(newnick->nick));
+ dbescapestring(escident, newnick->ident, strlen(newnick->ident));
+ dbescapestring(eschost, newnick->host->name->content, newnick->host->name->length);
+ dbescapestring(escreal, newnick->realname->name->content, newnick->realname->name->length);
if ((killed = kll_remove(newnick->nick))) //Is this nickname scheduled to reconnect?
{
deleteschedule(killed->schedule, &reconnectfake, killed);
free(killed);
- pqquery("UPDATE noperserv.fakeusers SET ident = '%s', host = '%s', realname = '%s' WHERE nick = '%s'",
+ dbquery("UPDATE noperserv.fakeusers SET ident = '%s', host = '%s', realname = '%s' WHERE nick = '%s'",
escident, eschost, escreal, escnick);
}
else
- pqquery("INSERT INTO noperserv.fakeusers (nick, ident, host, realname) VALUES ('%s', '%s', '%s', '%s')",
+ dbquery("INSERT INTO noperserv.fakeusers (nick, ident, host, realname) VALUES ('%s', '%s', '%s', '%s')",
escnick, escident, eschost, escreal);
controlreply(sender, "Added fake user %s", newnick->nick);
controlwall(NO_OPER, NL_FAKEUSERS, "Fake user %s!%s@%s (%s) added by %s/%s", newnick->nick, newnick->ident,
return CMD_USAGE;
if ((fake = ll_remove(cargv[0])))
{
- PQescapeString(escnick, fake->user->nick, strlen(fake->user->nick));
- pqquery("DELETE FROM noperserv.fakeusers WHERE nick = '%s'", escnick);
+ dbescapestring(escnick, fake->user->nick, strlen(fake->user->nick));
+ dbquery("DELETE FROM noperserv.fakeusers WHERE nick = '%s'", escnick);
controlreply(sender, "Killed fake user %s", fake->user->nick);
controlwall(NO_OPER, NL_FAKEUSERS, "Fake user %s!%s@%s (%s) removed by %s/%s", fake->user->nick, fake->user->ident,
fake->user->host->name->content, fake->user->realname->name->content, ((nick*)sender)->nick, ((nick*)sender)->authname);
}
if ((k_fake = kll_remove(cargv[0]))) //Fakeuser might be waiting to rejoin
{
- PQescapeString(escnick, k_fake->nick, strlen(k_fake->nick));
- pqquery("DELETE FROM noperserv.fakeusers WHERE nick = '%s'", escnick);
+ dbescapestring(escnick, k_fake->nick, strlen(k_fake->nick));
+ dbquery("DELETE FROM noperserv.fakeusers WHERE nick = '%s'", escnick);
controlreply(sender, "Killed fake user %s", k_fake->nick);
controlwall(NO_OPER, NL_FAKEUSERS, "Fake user %s!%s@%s (%s) removed by %s/%s", k_fake->nick,
k_fake->ident, k_fake->host, k_fake->realname, ((nick*)sender)->nick, ((nick*)sender)->authname);
}
void reconnectfake(void *details)
+//Called after the timeout period has expired since a fakeuser was killed, or on load
{
fakeuser *fake;
user_details *u_details = details;