added gnutls backend and moved backend code into new files
[ircu2.10.12-pk.git] / ircd / class.c
index 2509f6577be1e7b58fd5f924a2218cf5b263a946..216960534d2df75d48bd0e3e55173f4e7a40771a 100644 (file)
@@ -91,8 +91,10 @@ void free_class(struct ConnectionClass* p)
  */
 void init_class(void)
 {
-  if (!connClassList)
+  if (!connClassList) {
     connClassList = (struct ConnectionClass*) make_class();
+    connClassList->next   = 0;
+  }
 
   /* We had better not try and free this... */
   ConClass(connClassList) = "default";
@@ -101,8 +103,7 @@ void init_class(void)
   MaxLinks(connClassList) = feature_int(FEAT_MAXIMUM_LINKS);
   MaxSendq(connClassList) = feature_int(FEAT_DEFAULTMAXSENDQLENGTH);
   connClassList->valid    = 1;
-  Links(connClassList)    = 0;
-  connClassList->next     = 0;
+  Links(connClassList)    = 1;
 }
 
 /** Mark current connection classes as invalid.
@@ -135,13 +136,12 @@ void class_delete_marked(void)
     /*
      * unlink marked classes, delete unreferenced ones
      */
-    if (cl->valid)
+    if (cl->valid || Links(cl) > 1)
       prev = cl;
     else
     {
       prev->next = cl->next;
-      if (0 == --cl->ref_count)
-        free_class(cl);
+      free_class(cl);
     }
   }
 }
@@ -196,19 +196,6 @@ get_client_class(struct Client *acptr)
   return "(null-class)";
 }
 
-/** Get connection interval for a connection class.
- * @param[in] clptr Connection class to check (or NULL).
- * @return If \a clptr != NULL, its connection frequency; else default
- * connection frequency.
- */
-unsigned int get_con_freq(struct ConnectionClass * clptr)
-{
-  if (clptr)
-    return (ConFreq(clptr));
-  else
-    return feature_int(FEAT_CONNECTFREQUENCY);
-}
-
 /** Make sure we have a connection class named \a name.
  * If one does not exist, create it.  Then set its ping frequency,
  * connection frequency, maximum link count, and max SendQ according
@@ -227,7 +214,7 @@ void add_class(char *name, unsigned int ping, unsigned int confreq,
   Debug((DEBUG_DEBUG, "Add Class %s: cf: %u pf: %u ml: %u sq: %d",
          name, confreq, ping, maxli, sendq));
   assert(name != NULL);
-  p = find_class(name);
+  p = do_find_class(name, 1);
   if (!p)
     p = make_class();
   else
@@ -243,13 +230,16 @@ void add_class(char *name, unsigned int ping, unsigned int confreq,
 
 /** Find a connection class by name.
  * @param[in] name Name of connection class to search for.
+ * @param[in] extras If non-zero, include unreferenced classes.
  * @return Pointer to connection class structure (or NULL if none match).
  */
-struct ConnectionClass* find_class(const char *name)
+struct ConnectionClass* do_find_class(const char *name, int extras)
 {
   struct ConnectionClass *cltmp;
 
   for (cltmp = connClassList; cltmp; cltmp = cltmp->next) {
+    if (!cltmp->valid && !extras)
+      continue;
     if (!ircd_strcmp(ConClass(cltmp), name))
       return cltmp;
   }
@@ -268,9 +258,9 @@ report_classes(struct Client *sptr, const struct StatDesc *sd,
   struct ConnectionClass *cltmp;
 
   for (cltmp = connClassList; cltmp; cltmp = cltmp->next)
-    send_reply(sptr, RPL_STATSYLINE, 'Y', ConClass(cltmp), PingFreq(cltmp),
-              ConFreq(cltmp), MaxLinks(cltmp), MaxSendq(cltmp),
-              Links(cltmp));
+    send_reply(sptr, RPL_STATSYLINE, (cltmp->valid ? 'Y' : 'y'),
+               ConClass(cltmp), PingFreq(cltmp), ConFreq(cltmp),
+               MaxLinks(cltmp), MaxSendq(cltmp), Links(cltmp) - 1);
 }
 
 /** Return maximum SendQ length for a client.