added gnutls backend and moved backend code into new files
[ircu2.10.12-pk.git] / ircd / jupe.c
index c49b4faee2f87cfc1ecb543eb86fb97a6fe6c99d..243ae626df4fd5072160ef12934b922c15575e6e 100644 (file)
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * $Id$
  */
+/** @file
+ * @brief Implementation of juped server handling functions.
+ * @version $Id$
+ */
+#include "config.h"
+
 #include "jupe.h"
 #include "client.h"
 #include "hash.h"
 #include "ircd.h"
 #include "ircd_alloc.h"
+#include "ircd_features.h"
+#include "ircd_log.h"
 #include "ircd_reply.h"
 #include "ircd_string.h"
 #include "match.h"
 #include "s_misc.h"
 #include "send.h"
 #include "struct.h"
-#include "support.h"
 #include "sys.h"    /* FALSE bleah */
 
-#include <assert.h>
+/* #include <assert.h> -- Now using assert in ircd_log.h */
 #include <string.h>
 
+/** List of jupes. */
 static struct Jupe *GlobalJupeList = 0;
 
+/** Allocate a new jupe with the given parameters.
+ * @param[in] server Server name to jupe.
+ * @param[in] reason Reason for jupe.
+ * @param[in] expire Expiration time for jupe.
+ * @param[in] lastmod Last modification time for jupe.
+ * @param[in] flags Flags to set for the jupe.
+ */
 static struct Jupe *
 make_jupe(char *server, char *reason, time_t expire, time_t lastmod,
          unsigned int flags)
@@ -52,6 +65,7 @@ make_jupe(char *server, char *reason, time_t expire, time_t lastmod,
   ajupe = (struct Jupe*) MyMalloc(sizeof(struct Jupe)); /* alloc memory */
   assert(0 != ajupe);
 
+  memset(ajupe, 0, sizeof(*ajupe));
   DupString(ajupe->ju_server, server); /* copy vital information */
   DupString(ajupe->ju_reason, reason);
   ajupe->ju_expire = expire;
@@ -67,6 +81,11 @@ make_jupe(char *server, char *reason, time_t expire, time_t lastmod,
   return ajupe;
 }
 
+/** Apply a jupe.
+ * @param[in] cptr Local client that sent us the jupe.
+ * @param[in] sptr Originator of the jupe.
+ * @param[in] jupe Jupe to check.
+ */
 static int
 do_jupe(struct Client *cptr, struct Client *sptr, struct Jupe *jupe)
 {
@@ -84,6 +103,11 @@ do_jupe(struct Client *cptr, struct Client *sptr, struct Jupe *jupe)
   return exit_client_msg(cptr, acptr, &me, "Juped: %s", jupe->ju_reason);
 }
 
+/** Forward a jupe to another server.
+ * @param[in] cptr Local client that sent us the jupe.
+ * @param[in] sptr Originator of the jupe.
+ * @param[in] jupe Jupe to forward.
+ */
 static void
 propagate_jupe(struct Client *cptr, struct Client *sptr, struct Jupe *jupe)
 {
@@ -96,6 +120,17 @@ propagate_jupe(struct Client *cptr, struct Client *sptr, struct Jupe *jupe)
                        jupe->ju_reason);
 }
 
+/** Add a new server jupe.
+ * @param[in] cptr Local client that sent us the jupe.
+ * @param[in] sptr Originator of the jupe.
+ * @param[in] server Server name to jupe.
+ * @param[in] reason Reason for the jupe.
+ * @param[in] expire Jupe duration in seconds.
+ * @param[in] lastmod Last modification timestamp (or NULL).
+ * @param[in] flags Flags to set on jupe.
+ * @return Zero, unless the jupe causes \a cptr to be SQUIT, in which
+ * case CPTR_KILLED.
+ */
 int
 jupe_add(struct Client *cptr, struct Client *sptr, char *server, char *reason,
         time_t expire, time_t lastmod, unsigned int flags)
@@ -119,16 +154,17 @@ jupe_add(struct Client *cptr, struct Client *sptr, char *server, char *reason,
 
   /* Inform ops and log it */
   sendto_opmask_butone(0, SNO_NETWORK, "%s adding %sJUPE for %s, expiring at "
-                      "%Tu: %s", IsServer(sptr) ? sptr->name :
-                      sptr->user->server->name,
+                       "%Tu: %s",
+                       (feature_bool(FEAT_HIS_SNOTICES) || IsServer(sptr)) ?
+                         cli_name(sptr) :
+                         cli_name((cli_user(sptr))->server),
                       flags & JUPE_LOCAL ? "local " : "", server,
                       expire + TSoffset, reason);
 
-#ifdef JPATH
-  write_log(JPATH, "%Tu %C adding %sJUPE for %s, expiring at %Tu: %s\n",
-           TStime(), sptr, flags & JUPE_LOCAL ? "local " : "", server,
-           expire + TSoffset, reason);
-#endif /* JPATH */
+  log_write(LS_JUPE, L_INFO, LOG_NOSNOTICE,
+           "%#C adding %sJUPE for %s, expiring at %Tu: %s", sptr,
+           flags & JUPE_LOCAL ? "local " : "", server, expire + TSoffset,
+           reason);
 
   /* make the jupe */
   ajupe = make_jupe(server, reason, expire, lastmod, flags);
@@ -138,6 +174,15 @@ jupe_add(struct Client *cptr, struct Client *sptr, char *server, char *reason,
   return do_jupe(cptr, sptr, ajupe); /* remove server if necessary */
 }
 
+/** Activate a jupe, optionally changing its lastmod and flags.
+ * @param[in] cptr Local client that sent us the jupe.
+ * @param[in] sptr Originator of the jupe.
+ * @param[in] jupe Jupe to activate.
+ * @param[in] lastmod New timestamp for last modification of the jupe.
+ * @param[in] flags Flags to set on the jupe.
+ * @return Zero, unless the jupe causes \a cptr to be SQUIT, in which
+ * case CPTR_KILLED.
+ */
 int
 jupe_activate(struct Client *cptr, struct Client *sptr, struct Jupe *jupe,
              time_t lastmod, unsigned int flags)
@@ -145,7 +190,6 @@ jupe_activate(struct Client *cptr, struct Client *sptr, struct Jupe *jupe,
   unsigned int saveflags = 0;
 
   assert(0 != jupe);
-  assert(!JupeIsLocal(jupe));
 
   saveflags = jupe->ju_flags;
 
@@ -166,15 +210,15 @@ jupe_activate(struct Client *cptr, struct Client *sptr, struct Jupe *jupe,
   /* Inform ops and log it */
   sendto_opmask_butone(0, SNO_NETWORK, "%s activating JUPE for %s, expiring "
                       "at %Tu: %s",
-                      IsServer(sptr) ? sptr->name : sptr->user->server->name,
+                       (feature_bool(FEAT_HIS_SNOTICES) || IsServer(sptr)) ?
+                         cli_name(sptr) :
+                         cli_name((cli_user(sptr))->server),
                       jupe->ju_server, jupe->ju_expire + TSoffset,
                       jupe->ju_reason);
 
-#ifdef JPATH
-  write_log(JPATH, "%Tu %C activating JUPE for %s, expiring at %Tu: %s\n",
-           TStime(), sptr, jupe->ju_server, jupe->ju_expire + TSoffset,
-           jupe->ju_reason);
-#endif /* JPATH */
+  log_write(LS_JUPE, L_INFO, LOG_NOSNOTICE,
+           "%#C activating JUPE for %s, expiring at %Tu: %s",sptr,
+           jupe->ju_server, jupe->ju_expire + TSoffset, jupe->ju_reason);
 
   if (!(flags & JUPE_LOCAL)) /* don't propagate local changes */
     propagate_jupe(cptr, sptr, jupe);
@@ -182,6 +226,14 @@ jupe_activate(struct Client *cptr, struct Client *sptr, struct Jupe *jupe,
   return do_jupe(cptr, sptr, jupe);
 }
 
+/** Deactivate a jupe.
+ * @param[in] cptr Local client that sent us the jupe.
+ * @param[in] sptr Originator of the jupe.
+ * @param[in] jupe Jupe to deactivate.
+ * @param[in] lastmod New timestamp for last modification of the jupe.
+ * @param[in] flags Flags to set on the jupe.
+ * @return Zero.
+ */
 int
 jupe_deactivate(struct Client *cptr, struct Client *sptr, struct Jupe *jupe,
                time_t lastmod, unsigned int flags)
@@ -211,16 +263,17 @@ jupe_deactivate(struct Client *cptr, struct Client *sptr, struct Jupe *jupe,
   /* Inform ops and log it */
   sendto_opmask_butone(0, SNO_NETWORK, "%s %s JUPE for %s, expiring at %Tu: "
                       "%s",
-                      IsServer(sptr) ? sptr->name : sptr->user->server->name,
+                       (feature_bool(FEAT_HIS_SNOTICES) || IsServer(sptr)) ?
+                         cli_name(sptr) :
+                         cli_name((cli_user(sptr))->server),
                       JupeIsLocal(jupe) ? "removing local" : "deactivating",
                       jupe->ju_server, jupe->ju_expire + TSoffset,
                       jupe->ju_reason);
 
-#ifdef JPATH
-  write_log(JPATH, "%Tu %s %s JUPE for %s, expiring at %Tu: %s\n", TStime(),
-           sptr, JupeIsLocal(jupe) ? "removing local" : "deactivating",
+  log_write(LS_JUPE, L_INFO, LOG_NOSNOTICE,
+           "%#C %s JUPE for %s, expiring at %Tu: %s", sptr,
+           JupeIsLocal(jupe) ? "removing local" : "deactivating",
            jupe->ju_server, jupe->ju_expire + TSoffset, jupe->ju_reason);
-#endif /* JPATH */
 
   if (JupeIsLocal(jupe))
     jupe_free(jupe);
@@ -230,6 +283,10 @@ jupe_deactivate(struct Client *cptr, struct Client *sptr, struct Jupe *jupe,
   return 0;
 }
 
+/** Find a jupe by name.
+ * @param[in] server %Jupe name to search for.
+ * @return Matching jupe (or NULL if none match).
+ */
 struct Jupe *
 jupe_find(char *server)
 {
@@ -248,6 +305,9 @@ jupe_find(char *server)
   return 0;
 }
 
+/** Unlink and free an unused jupe.
+ * @param[in] jupe Server jupe to free.
+ */
 void
 jupe_free(struct Jupe* jupe)
 {
@@ -262,6 +322,9 @@ jupe_free(struct Jupe* jupe)
   MyFree(jupe);
 }
 
+/** Send the full list of active global jupes to \a cptr.
+ * @param[in] cptr Local server to send jupes to.
+ */
 void
 jupe_burst(struct Client *cptr)
 {
@@ -281,6 +344,10 @@ jupe_burst(struct Client *cptr)
   }
 }
 
+/** Forward a jupe to another server.
+ * @param[in] cptr %Server to send jupe to.
+ * @param[in] jupe Jupe to forward.
+ */
 int
 jupe_resend(struct Client *cptr, struct Jupe *jupe)
 {
@@ -295,6 +362,11 @@ jupe_resend(struct Client *cptr, struct Jupe *jupe)
   return 0;
 }
 
+/** Send a jupe (or a list of jupes) to a server.
+ * @param[in] sptr Client searching for jupes.
+ * @param[in] server Name of jupe to search for (if NULL, list all).
+ * @return Zero.
+ */
 int
 jupe_list(struct Client *sptr, char *server)
 {
@@ -307,7 +379,7 @@ jupe_list(struct Client *sptr, char *server)
 
     /* send jupe information along */
     send_reply(sptr, RPL_JUPELIST, jupe->ju_server, jupe->ju_expire + TSoffset,
-              JupeIsLocal(jupe) ? me.name : "*",
+              JupeIsLocal(jupe) ? cli_name(&me) : "*",
               JupeIsActive(jupe) ? '+' : '-', jupe->ju_reason);
   } else {
     for (jupe = GlobalJupeList; jupe; jupe = sjupe) { /* go through jupes */
@@ -318,7 +390,7 @@ jupe_list(struct Client *sptr, char *server)
       else /* send jupe information along */
        send_reply(sptr, RPL_JUPELIST, jupe->ju_server,
                   jupe->ju_expire + TSoffset,
-                  JupeIsLocal(jupe) ? me.name : "*",
+                  JupeIsLocal(jupe) ? cli_name(&me) : "*",
                   JupeIsActive(jupe) ? '+' : '-', jupe->ju_reason);
     }
   }
@@ -326,3 +398,23 @@ jupe_list(struct Client *sptr, char *server)
   /* end of jupe information */
   return send_reply(sptr, RPL_ENDOFJUPELIST);
 }
+
+/** Count jupes and memory used by them.
+ * @param[out] ju_size Receives total number of bytes allocated for jupes.
+ * @return Number of jupes currently allocated.
+ */
+int
+jupe_memory_count(size_t *ju_size)
+{
+  struct Jupe *jupe;
+  unsigned int ju = 0;
+
+  for (jupe = GlobalJupeList; jupe; jupe = jupe->ju_next)
+  {
+    ju++;
+    *ju_size += sizeof(struct Jupe);
+    *ju_size += jupe->ju_server ? (strlen(jupe->ju_server) + 1) : 0;
+    *ju_size += jupe->ju_reason ? (strlen(jupe->ju_reason) + 1) : 0;
+  }
+  return ju;
+}