]> jfr.im git - irc/quakenet/newserv.git/blobdiff - trusts/trusts.c
Merge chanserv-live into default.
[irc/quakenet/newserv.git] / trusts / trusts.c
index ac1a137ca0a1cee0afa232c12c5fc50042e7cf28..c34974bbad50aa2619d8b648c0cc8cc606e65b28 100644 (file)
@@ -1,18 +1,24 @@
 #include <stdio.h>
+#include <string.h>
+#include "../lib/version.h"
 #include "../core/hooks.h"
 #include "../core/error.h"
+#include "../core/nsmalloc.h"
+#include "../server/server.h"
 #include "trusts.h"
 
-int trusts_loaddb(void);
-void trusts_closedb(void);
+MODULE_VERSION("");
+
 void trusts_registerevents(void);
 void trusts_deregisterevents(void);
 
 static void statusfn(int, void *);
+static void whoisfn(int, void *);
 
-static int loaded;
+static sstring *tgextnames[MAXTGEXTS];
 
 int trusts_thext, trusts_nextuserext;
+int trustsdbloaded;
 
 void _init(void) {
   trusts_thext = registernickext("trustth");
@@ -28,11 +34,8 @@ void _init(void) {
     return;
   }
 
-  if(!trusts_loaddb())
-    return;
-  loaded = 1;
-
   registerhook(HOOK_CORE_STATSREQUEST, statusfn);
+  registerhook(HOOK_CONTROL_WHOISREQUEST, &whoisfn);
   trusts_registerevents();
 }
 
@@ -42,12 +45,51 @@ void _fini(void) {
     releasenickext(trusts_nextuserext);
   }
 
-  if(loaded) {
-    deregisterhook(HOOK_CORE_STATSREQUEST, statusfn);
-    trusts_deregisterevents();
+  deregisterhook(HOOK_CORE_STATSREQUEST, statusfn);
+  deregisterhook(HOOK_CONTROL_WHOISREQUEST, &whoisfn);
+  trusts_deregisterevents();
+
+  nscheckfreeall(POOL_TRUSTS);
+}
+
+static void whoisfn(int hooknum, void *arg) {
+  trusthost *th;
+  char message[512];
+  nick *np = (nick *)arg;
+
+  if(!np)
+    return;
+
+  th = gettrusthost(np);
+
+  if(!th)
+    return;
+
+  snprintf(message, sizeof(message), "Trustgroup: %s (#%d)", th->group->name->content, th->group->id);
+  triggerhook(HOOK_CONTROL_WHOISREPLY, message);
+
+  if (th->maxpernode > 0) {
+    snprintf(message, sizeof(message), "Node      : %s", CIDRtostr(np->ipaddress, th->nodebits));
+    triggerhook(HOOK_CONTROL_WHOISREPLY, message);
+
+    patricia_node_t *node;
+    int usercount = 0;
+
+    node = refnode(iptree, &(np->ipaddress), th->nodebits);
+    usercount = node->usercount;
+    derefnode(iptree, node);
+
+    snprintf(message, sizeof(message), "Node      : Usage: %d/%d", usercount, th->maxpernode);
+    triggerhook(HOOK_CONTROL_WHOISREPLY, message);
   }
 
-  trusts_closedb();
+  if (th->group->trustedfor > 0) {
+    snprintf(message, sizeof(message), "Trusthost : %s", CIDRtostr(th->ip, th->bits));
+    triggerhook(HOOK_CONTROL_WHOISREPLY, message);
+
+    snprintf(message, sizeof(message), "Trustgroup : Usage: %d/%d", th->group->count, th->group->trustedfor);
+    triggerhook(HOOK_CONTROL_WHOISREPLY, message);
+  }
 }
 
 static void statusfn(int hooknum, void *arg) {
@@ -68,3 +110,50 @@ static void statusfn(int hooknum, void *arg) {
     triggerhook(HOOK_CORE_STATSREPLY, message);
   }  
 }
+
+int findtgext(const char *name) {
+  int i;
+
+  for(i=0;i<MAXTGEXTS;i++)
+    if(tgextnames[i] && !strcmp(name, tgextnames[i]->content))
+      return i;
+
+  return -1;
+}
+
+int registertgext(const char *name) {
+  int i;
+
+  if(findtgext(name) != -1) {
+    Error("trusts", ERR_WARNING, "Tried to register duplicate trust group extension: %s.", name);
+    return -1;
+  }
+
+  for(i=0;i<MAXTGEXTS;i++) {
+    if(!tgextnames[i]) {
+      tgextnames[i] = getsstring(name, 100);
+      return i;
+    }
+  }
+
+  Error("trusts", ERR_WARNING, "Tried to register too many trust group extensions: %s.", name);
+  return -1;
+}
+
+void releasetgext(int index) {
+  trustgroup *tg;
+
+  freesstring(tgextnames[index]);
+  tgextnames[index] = NULL;
+
+  for(tg=tglist;tg;tg=tg->next)
+    tg->exts[index] = NULL;
+}
+
+int trusts_fullyonline(void) {
+  if(myhub == -1)
+    return 0;
+
+  return serverlist[myhub].linkstate == LS_LINKED;
+}
+