]> jfr.im git - irc/quakenet/newserv.git/commitdiff
Fixed cleanup for fasttrack records.
authorGunnar Beutner <redacted>
Fri, 28 Jun 2013 15:20:05 +0000 (17:20 +0200)
committerGunnar Beutner <redacted>
Fri, 28 Jun 2013 15:20:05 +0000 (17:20 +0200)
--HG--
branch : shroudrequest

request/request_fasttrack.c

index 2378b0660b3fdee3866b77185a2da8fe89e725c8..c1c75e3bf53803a41e3a483d964c913053d811b9 100644 (file)
@@ -36,13 +36,16 @@ int rq_initfasttrack(void) {
 }
 
 void rq_finifasttrack(void) {
-  rq_fasttrack *ft;
+  rq_fasttrack *ft, *next;
 
   deregisterhook(HOOK_NICK_NEWNICK, &rqhook_account);
   deregisterhook(HOOK_NICK_ACCOUNT, &rqhook_account);
 
-  for(ft=ftlist;ft;ft=ft->next)
+  for(ft=ftlist;ft;) {
+    next = ft->next;
     free(ft);
+    ft = next;
+  }
 
   releasenickext(rqnext);
 }
@@ -65,7 +68,32 @@ static void rqhook_account(int hook, void *arg) {
 }
 
 static void rq_cleanup_fasttrack(void *arg) {
+  time_t now = getnettime();
+  rq_fasttrack **pft, *ft;
+  int j;
+  nick *tnp;
+
+  now = getnettime();
+
+  pft = &ftlist;
+
+  for(ft=*pft;*pft;pft=&((*pft)->next)) {
+    int foundnick = 0;
 
+    for(j=0;j<NICKHASHSIZE && !foundnick;j++) {
+      for(tnp=nicktable[j];tnp;tnp=tnp->next) {
+        if(tnp->exts[rqnext]==ft) {
+          foundnick = 1;
+          break;
+        }
+      }
+    }
+
+    if(ft->refill_time < now) {
+      *pft = ft->next;
+      free(ft);
+    }
+  }
 }
 
 static rq_fasttrack *rq_getfasttrack(nick *np) {
@@ -87,6 +115,9 @@ static rq_fasttrack *rq_getfasttrack(nick *np) {
   ft->targets = 0;
   ft->refill_time = 0;
 
+  ft->next = ftlist;
+  ftlist = ft;
+
   np->exts[rqnext] = ft;
 
   return ft;