]> jfr.im git - irc/quakenet/newserv.git/blobdiff - glines/glines_store.c
TRUSTS: use correct socket opt...
[irc/quakenet/newserv.git] / glines / glines_store.c
index cfb7c20d37fc9f15cc0fd3ff0eb69606c0f33c51..a52f51bc4151f7129ec0437773b3ac0fde66b9a5 100644 (file)
@@ -1,6 +1,11 @@
 #include <stdio.h>
+#include "../lib/version.h"
+#include "../core/schedule.h"
+#include "../control/control.h"
 #include "glines.h"
 
+MODULE_VERSION("");
+
 static int glstore_savefile(const char *file) {
   FILE *fp;
   gline *gl;
@@ -17,7 +22,7 @@ static int glstore_savefile(const char *file) {
     fprintf(fp, "%s %jd,%jd,%jd,%d,%s,%s\n",
       glinetostring(gl), (intmax_t)gl->expire, (intmax_t)gl->lastmod, (intmax_t)gl->lifetime,
       (gl->flags & GLINE_ACTIVE) ? 1 : 0,
-      gl->creator->content, gl->reason->content);
+      gl->creator->content, gl->reason ? gl->reason->content : "");
     count++;
   }
 
@@ -58,7 +63,7 @@ static int glstore_loadfile(const char *file) {
 
     gl->creator = getsstring(creator, 512);
 
-    gl->flags = active ? GLINE_ACTIVE : 0;
+    gl->flags |= active ? GLINE_ACTIVE : 0;
 
     gl->reason = getsstring(reason, 512);
     gl->expire = expire;
@@ -69,6 +74,8 @@ static int glstore_loadfile(const char *file) {
     glinelist = gl;
   }
 
+  fclose(fp);
+
   return count;
 }
 
@@ -103,3 +110,50 @@ int glstore_load(void) {
   return glstore_loadfile(path);
 }
 
+static int glines_cmdsaveglines(void *source, int cargc, char **cargv) {
+  nick *sender = source;
+  int count;
+
+  count = glstore_save();
+
+  if (count < 0)
+    controlreply(sender, "An error occured while saving G-Lines.");
+  else
+    controlreply(sender, "Saved %d G-Line%s.", count, (count == 1) ? "" : "s");
+
+  return CMD_OK;
+}
+
+static int glines_cmdloadglines(void *source, int cargc, char **cargv) {
+  nick *sender = source;
+  int count;
+
+  count = glstore_load();
+
+  if (count < 0)
+    controlreply(sender, "An error occured while loading the G-Lines file.");
+  else
+    controlreply(sender, "Loaded %d G-Line%s.", count, (count == 1) ? "" : "s");
+
+  return CMD_OK;
+}
+
+static void glines_sched_save(void *arg) {
+  glstore_save();
+}
+
+void _init() {
+  registercontrolhelpcmd("loadglines", NO_DEVELOPER, 0, glines_cmdloadglines, "Usage: loadglines\nForce load of glines.");
+  registercontrolhelpcmd("saveglines", NO_DEVELOPER, 0, glines_cmdsaveglines, "Usage: saveglines\nForce save of glines.");
+
+  schedulerecurring(time(NULL), 0, GLSTORE_SAVE_INTERVAL, &glines_sched_save, NULL);
+
+  glstore_load();
+}
+
+void _fini() {
+  deregistercontrolcmd("loadglines", glines_cmdloadglines);
+  deregistercontrolcmd("saveglines", glines_cmdsaveglines);
+
+  deleteschedule(NULL, glines_sched_save, NULL);
+}