]> jfr.im git - irc/quakenet/newserv.git/blobdiff - glines/glines_handler.c
Add missing "Done." reply.
[irc/quakenet/newserv.git] / glines / glines_handler.c
index 2c70c4f9ac26db76b1782afc2e471807d541ed91..6a2c1b88f27b20c5d9cc7d4a77673f5ee22b9064 100644 (file)
@@ -17,6 +17,7 @@ int handleglinemsg(void *source, int cargc, char **cargv) {
   long creatornum;
   gline *agline;
   nick *np;
+  glinebuf gbuf;
 
   /**
    * Valid GL tokens have X params:
@@ -79,6 +80,12 @@ int handleglinemsg(void *source, int cargc, char **cargv) {
   /* 2nd param is mask */
   mask = cargv[1];
 
+  /* snircd 1.3.5 can destroy glines, no #if here */
+  if (*mask == '%') {
+    flags |= GLINE_DESTROY;
+    mask++;
+  }
+
   switch (*mask) {
     case '+':
       flags |= GLINE_ACTIVATE;
@@ -129,27 +136,29 @@ int handleglinemsg(void *source, int cargc, char **cargv) {
     agline = findgline(mask);
 
     if (agline) {
-      if (agline->flags & GLINE_ACTIVE) { 
-        Error("debuggline", ERR_WARNING, "Duplicate Gline recieved for %s - old lastmod %lu, expire %lu, lifetime %lu, reason %s, creator %s", mask, agline->lastmod, agline->expire, agline->lifetime, agline->reason->content, agline->creator->content);
+      Error("debuggline", ERR_WARNING, "Update for existing gline received for %s - old lastmod %lu, expire %lu, lifetime %lu, reason %s, creator %s", mask, agline->lastmod, agline->expire, agline->lifetime, agline->reason->content, agline->creator->content);
+
+      agline->flags |= GLINE_ACTIVE;
+
+      /* check lastmod then assume the new gline is authoritive */
+      if (lastmod > agline->lastmod) {
+        agline->lastmod = lastmod;
+        agline->expire = expire;
+        agline->lifetime = lifetime;
+        freesstring(agline->creator);
+        agline->creator = getsstring(creator, 255);
+        freesstring(agline->reason);
+        agline->reason = getsstring(reason, 255); 
       } else {
-        /* we're reactivating a gline - check lastmod then assume the new gline is authoritive */
-        if (lastmod > agline->lastmod) {
-          agline->lastmod = lastmod;
-          agline->expire = expire;
-          agline->lifetime = lifetime;
-          agline->creator = getsstring(creator, 255);
-          freesstring(agline->reason);
-          agline->reason = getsstring(reason, 255); 
-          agline->flags |= GLINE_ACTIVE;
-        } else {
-          Error("debuggline", ERR_WARNING, "received a gline with a lower lastmod");
-          /* @@@TODO resend our gline ? */
-        } 
-      }
-      /* TODO */
-      return CMD_ERROR;
+        Error("debuggline", ERR_WARNING, "received a gline with a lower lastmod");
+        /* Don't send our gline as that might cause loops in case we don't understand the gline properly. */
+      } 
+
+      return CMD_OK;
     } else {
-      gline_add(creator, mask, reason, expire, lastmod, lifetime); 
+      glinebufinit(&gbuf, 0);
+      glinebufadd(&gbuf, mask, creator, reason, expire, lastmod, lifetime);
+      glinebufflush(&gbuf, 0);
     } 
   } else if (flags & GLINE_DEACTIVATE) {
     /* deactivate gline */
@@ -164,12 +173,22 @@ int handleglinemsg(void *source, int cargc, char **cargv) {
         case 5:
           /* asuka last mod */
           lastmod = atoi(cargv[3]);
-          gline_deactivate(agline, lastmod, 0);
+          
+          if (flags & GLINE_DESTROY)
+            gline_destroy(agline, lastmod, 0);
+          else
+            gline_deactivate(agline, lastmod, 0);
+
           break;
         case 6:
           /* snircd */
           lastmod = atoi(cargv[3]);
-          gline_deactivate(agline, lastmod, 0);
+
+          if (flags & GLINE_DESTROY)
+            gline_destroy(agline, lastmod, 0);
+          else
+            gline_deactivate(agline, lastmod, 0);
+
           break;
         default:
           Error("gline", ERR_WARNING, "Gline Deactivate with invalid number (%d) of arguments", cargc);
@@ -202,14 +221,17 @@ int handleglinemsg(void *source, int cargc, char **cargv) {
            return CMD_ERROR;
       }
 
-      agline = gline_add(creator, mask, reason, expire, lastmod, lifetime);
+      glinebufinit(&gbuf, 0);
+      agline = glinebufadd(&gbuf, mask, creator, reason, expire, lastmod, lifetime);
 
       if (!agline) {
+        glinebufabandon(&gbuf);
         Error("gline", ERR_WARNING, "gline_add failed");
         return CMD_ERROR;
       }
 
       gline_deactivate(agline, lastmod, 0);
+      glinebufflush(&gbuf, 0);
 
       return CMD_OK;
     }
@@ -232,7 +254,6 @@ int handleglinemsg(void *source, int cargc, char **cargv) {
         agline->reason = getsstring(reason, 255);
       } else {
         Error("debuggline", ERR_WARNING, "received a gline modification with a lower lastmod");
-        /* @@@TODO resend our gline ? */
       }
 
       return CMD_OK;