]> jfr.im git - irc/quakenet/newserv.git/blobdiff - chanserv/database/chanservdb_hash.c
fix bug in G stats
[irc/quakenet/newserv.git] / chanserv / database / chanservdb_hash.c
index 9981284168f7ad6d9e0f3929b00508af9c8aa2ea..34ab783ce5e6cc1c291394749d1fa6a081952b0b 100644 (file)
@@ -6,6 +6,7 @@
  */
 
 #include <string.h>
+#include <strings.h>
 
 #include "../chanserv.h"
 #include "../../lib/irc_string.h"
@@ -34,7 +35,7 @@ void addregusertohash(reguser *rup) {
   rup->nextbyname=regusernicktable[hash];
   regusernicktable[hash]=rup;
 
-  anp=findorcreateauthname(rup->ID);
+  anp=findorcreateauthname(rup->ID, rup->username);
   anp->exts[chanservaext]=rup;
 }
 
@@ -72,7 +73,7 @@ reguser *findreguserbyemail(const char *email) {
 
   for (i=0;i<REGUSERHASHSIZE;i++) {
     for (rup=regusernicktable[i];rup;rup=rup->nextbyname) {
-      if (!ircd_strcmp(email,rup->email->content)) {
+      if (rup->email && !strcasecmp(email,rup->email->content)) {
         return rup;
       }
     }
@@ -201,12 +202,22 @@ maildomain *findmaildomainbydomain(char *domain) {
 
   hash=maildomainnamehash(domain);
   for (mdp=maildomainnametable[hash]; mdp; mdp=mdp->nextbyname)
-    if (!ircd_strcmp(mdp->name->content, domain))
+    if (!strcasecmp(mdp->name->content, domain))
       return mdp;
 
   return NULL;
 }
 
+maildomain *findnearestmaildomain(char *domain) {
+  maildomain *m = findmaildomainbydomain(domain);
+  char *p;
+
+  if(!m && (p=strchr(domain, '.')))
+    return findnearestmaildomain(++p);
+
+  return m;
+}
+
 maildomain *findmaildomainbyemail(char *email) {
   char *domain;
 
@@ -221,8 +232,7 @@ maildomain *findmaildomainbyemail(char *email) {
 maildomain *findorcreatemaildomain(char *email) {
   unsigned int hash;
   char *domain,*pdomain;
-  maildomain *mdp, *pmdp;
-  char parent=0;
+  maildomain *mdp;
 
   if (!(domain=strchr(email, '@')))
     domain=email;
@@ -234,7 +244,7 @@ maildomain *findorcreatemaildomain(char *email) {
 
   hash=maildomainnamehash(domain);
   for (mdp=maildomainnametable[hash]; mdp; mdp=mdp->nextbyname)
-    if (!ircd_strcmp(mdp->name->content, domain))
+    if (!strcasecmp(mdp->name->content, domain))
       return mdp;
 
   mdp=getmaildomain();
@@ -242,19 +252,20 @@ maildomain *findorcreatemaildomain(char *email) {
   mdp->name=getsstring(domain, EMAILLEN);
   mdp->count=0;
   mdp->limit=0;
+  mdp->actlimit=MD_DEFAULTACTLIMIT;
+  mdp->flags=MDFLAG_DEFAULT;
   mdp->users=NULL;
   addmaildomaintohash(mdp);
 
-  pdomain=domain;
-  while(pdomain=strchr(pdomain, '.')) {
-    parent = 1;
+  pdomain=strchr(domain, '.');
+
+  if(pdomain) {
     pdomain++;
-    pmdp = findorcreatemaildomain(pdomain);
-    mdp->parent = pmdp;
-  }
-  if(!parent) {
+    mdp->parent = findorcreatemaildomain(pdomain);
+  } else {
     mdp->parent = NULL;
   }
+
   return mdp;
 }
 
@@ -305,10 +316,13 @@ void addregusertomaildomain(reguser *rup, maildomain *mdp) {
 }
 
 void delreguserfrommaildomain(reguser *rup, maildomain *mdp) {
-  maildomain *smdp;
+  maildomain *smdp, *nmdp;
   reguser *ruh, *pruh=NULL;
   int found=0;
 
+  if(!mdp)
+    return;
+
   for (ruh=mdp->users; ruh; ruh=ruh->nextbydomain) {
     if (ruh==rup) {
       /* Found the user */
@@ -328,16 +342,21 @@ void delreguserfrommaildomain(reguser *rup, maildomain *mdp) {
     return;
   }
 
-  for(smdp=mdp;smdp;smdp=smdp->parent) {
-    smdp->count--;
+  /* Free it from all the parent domains, cleaning up as we go.. */
+  for(smdp=mdp;smdp;smdp=nmdp) {
+    nmdp=smdp->parent;
+
+    /* Keep it if there are users left or we're remembering something about it. */    
+    if (--smdp->count || (smdp->flags != MDFLAG_DEFAULT) || (smdp->actlimit != MD_DEFAULTACTLIMIT))
+      continue;
+    
+    removemaildomainfromhash(smdp);
+    freesstring(smdp->name);
+    freemaildomain(smdp);
   }
+
   rup->domain=NULL;
   freesstring(rup->localpart);
   rup->localpart=NULL;
-
-  if (!mdp->count && !MDHasLimit(mdp)) {
-    removemaildomainfromhash(mdp);
-    freemaildomain(mdp);
-  }
 }