]> jfr.im git - irc/quakenet/newserv.git/blobdiff - server/server.c
TRUSTS: require sqlite
[irc/quakenet/newserv.git] / server / server.c
index c5fc0d274fbc28d6ab1f2c3db87fd70a60fbfa87..9ba31e114748d39585a9d7cb87ef912caf3b29b6 100644 (file)
 #include "../core/error.h"
 #include "../core/hooks.h"
 #include "../core/config.h"
+#include "../lib/version.h"
 #include "server.h"
 
 #include <stdio.h>
 #include <string.h>
 
+MODULE_VERSION("");
+
 int findserver(const char *name);
 void completelink(int servernum);
 
 server serverlist[MAXSERVERS];
-int myhub;
+long myhub;
+
+const flag smodeflags[] = {
+   { 'h', SMODE_HUB },
+   { '6', SMODE_IPV6 },
+   { 's', SMODE_SERVICE },
+   { 'n', SMODE_OPERNAME },
+   { '\0', 0 } };
 
 void _init() {
   /* Initialise the server tree */
@@ -32,7 +42,10 @@ void _init() {
   serverlist[numerictolong(mynumeric->content,2)].name=getsstring(myserver->content,HOSTLEN);
   serverlist[numerictolong(mynumeric->content,2)].description=getcopyconfigitem("irc","serverdescription","newserv",100);
   serverlist[numerictolong(mynumeric->content,2)].maxusernum=MAXLOCALUSER;
+  serverlist[numerictolong(mynumeric->content,2)].ts=getnettime();
   serverlist[numerictolong(mynumeric->content,2)].linkstate=LS_LINKED;
+  /* remember to update the mode line in irc/irc.c */
+  serverlist[numerictolong(mynumeric->content,2)].flags=SMODE_SERVICE|SMODE_IPV6|SMODE_HUB|SMODE_OPERNAME;
   
   /* Register the protocol messages we handle */
   registerserverhandler("SERVER",&handleservermsg,8);
@@ -55,29 +68,37 @@ void _fini() {
   deregisterhook(HOOK_IRC_DISCON,&handledisconnect);
   
   for (i=0;i<MAXSERVERS;i++) {
-    if (serverlist[i].name!=NULL)
-      freesstring(serverlist[i].name);
+    freesstring(serverlist[i].name);
+    freesstring(serverlist[i].description);
   }
 }
 
 int handleservermsg(void *source, int cargc, char **cargv) {
-  int servernum;
+  long servernum;
   
   servernum=numerictolong(cargv[5],2);
   
   if (serverlist[servernum].name!=NULL) {
-    Error("server",ERR_ERROR,"New server %d already exists in servertable.",servernum);
+    Error("server",ERR_ERROR,"New server %ld already exists in servertable.",servernum);
     return CMD_ERROR;
   }
  
   serverlist[servernum].name=getsstring(cargv[0],HOSTLEN);
   serverlist[servernum].description=getsstring(cargv[cargc-1],REALLEN);
   serverlist[servernum].maxusernum=numerictolong(cargv[5]+2,3);
-  
+  serverlist[servernum].ts=strtoull(cargv[3], NULL, 10);
+  serverlist[servernum].marker=0;
+  setflags(&serverlist[servernum].flags,SMODE_ALL,cargv[6],smodeflags,REJECT_NONE);
+
   if (!strncmp((char *)source,"INIT",4)) {
     /* This is the initial server */
     myhub=servernum;
     serverlist[servernum].parent=numerictolong(mynumeric->content,2);
+    triggerhook(HOOK_IRC_SENDBURSTSERVERS,NULL);
+    triggerhook(HOOK_IRC_SENDBURSTNICKS,NULL);
+    triggerhook(HOOK_IRC_SENDBURSTBURSTS,NULL);
+    irc_send("%s EB",mynumeric->content);
+    triggerhook(HOOK_IRC_CONNECTED,NULL);
   } else {
     serverlist[servernum].parent=numerictolong(source,2);
   }    
@@ -96,7 +117,7 @@ int handleservermsg(void *source, int cargc, char **cargv) {
 }
 
 int handleeobmsg(void *source, int cargc, char **argv) {
-  int servernum;
+  long servernum;
   
   servernum=numerictolong(source,2);
   completelink(servernum);
@@ -112,14 +133,14 @@ int handleeobmsg(void *source, int cargc, char **argv) {
 }
 
 int handlesquitmsg(void *source, int cargc, char **cargv) {
-  int servernum=findserver(cargv[0]);
+  long servernum=findserver(cargv[0]);
   if (servernum<0) {
     Error("server",ERR_WARNING,"Received SQUIT for unknown server %s\n",cargv[0]);
     return CMD_ERROR;
   }
   if (servernum==myhub) {
     Error("server",ERR_WARNING,"Rejected by our hub: %s",cargv[cargc-1]);
-    irc_disconnected();
+    irc_disconnected(0);
     return CMD_OK;
   }
   deleteserver(servernum);
@@ -151,14 +172,15 @@ void completelink(int servernum) {
   
   /* This server is now fully linked. */
   serverlist[servernum].linkstate=LS_LINKED;
+  triggerhook(HOOK_SERVER_LINKED, (void *)(long)servernum);
   Error("server",ERR_DEBUG,"Setting link state on %s to LS_LINKED",serverlist[servernum].name->content);
 }  
 
-void deleteserver(int servernum) {
+void deleteserver(long servernum) {
   int i;
   
   if (serverlist[servernum].name==NULL) {
-    Error("server",ERR_WARNING,"Tried to remove server %d which doesn't exist.",servernum);
+    Error("server",ERR_WARNING,"Tried to remove server %ld which doesn't exist.",servernum);
     return;
   }
   
@@ -193,3 +215,18 @@ int findserver(const char *name) {
   return -1;
 }
 
+unsigned int nextservermarker(void) {
+  int i;
+  static unsigned int servermarker=0;
+
+  servermarker++;
+  if (!servermarker) {
+    /* If we wrapped to zero, zap the marker on all hosts */
+    for (i=0;i<MAXSERVERS;i++)
+      serverlist[i].marker=0;
+    servermarker++;
+  }
+
+  return servermarker;
+}
+