]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - modules/m_stats.c
extern void send_pop_queue(struct Client *); in header, will implement this some...
[irc/rqf/shadowircd.git] / modules / m_stats.c
index 3c52100a7e459a9334b7ef20fe6089f173ff3ddc..dd82e417e83715125c3e131976c56f143389c937 100644 (file)
@@ -25,7 +25,6 @@
  */
 
 #include "stdinc.h"
-#include "tools.h"             /* dlink_node/dlink_list */
 #include "class.h"             /* report_classes */
 #include "client.h"            /* Client */
 #include "common.h"            /* TRUE/FALSE */
 #include "numeric.h"           /* ERR_xxx */
 #include "scache.h"            /* list_scache */
 #include "send.h"              /* sendto_one */
-#include "commio.h"            /* highest_fd */
 #include "s_conf.h"            /* ConfItem */
 #include "s_serv.h"            /* hunt_server */
 #include "s_stats.h"           /* tstats */
 #include "s_user.h"            /* show_opers */
-#include "event.h"             /* events */
 #include "blacklist.h"         /* dnsbl stuff */
-#include "linebuf.h"
 #include "parse.h"
 #include "modules.h"
 #include "hook.h"
@@ -73,7 +69,7 @@ DECLARE_MODULE_AV1(stats, NULL, NULL, stats_clist, stats_hlist, NULL, "$Revision
 
 const char *Lformat = "%s %u %u %u %u %u :%u %u %s";
 
-static void stats_l_list(struct Client *s, const char *, int, int, dlink_list *, char);
+static void stats_l_list(struct Client *s, const char *, int, int, rb_dlink_list *, char);
 static void stats_l_client(struct Client *source_p, struct Client *target_p,
                                char statchar);
 
@@ -122,7 +118,7 @@ static void stats_memory(struct Client *);
 static void stats_servlinks(struct Client *);
 static void stats_ltrace(struct Client *, int, const char **);
 static void stats_ziplinks(struct Client *);
-
+static void stats_comm(struct Client *);
 /* This table contains the possible stats items, in order:
  * stats letter,  function to call, operonly? adminonly?
  * case only matters in the stats letter column.. -- fl_
@@ -139,8 +135,8 @@ static struct StatsStruct stats_cmd_table[] = {
        {'D', stats_deny,               1, 0, },
        {'e', stats_exempt,             1, 0, },
        {'E', stats_events,             1, 1, },
-       {'f', comm_dump,                1, 1, },
-       {'F', comm_dump,                1, 1, },
+       {'f', stats_comm,               1, 1, },
+       {'F', stats_comm,               1, 1, },
        {'g', stats_pending_glines,     1, 0, },
        {'G', stats_glines,             1, 0, },
        {'h', stats_hubleaf,            0, 0, },
@@ -226,13 +222,18 @@ m_stats(struct Client *client_p, struct Client *source_p, int parc, const char *
                        /* Called for remote clients and for local opers, so check need_admin
                         * and need_oper
                         */
-                       if((stats_cmd_table[i].need_admin && !IsOperAdmin (source_p)) ||
-                          (stats_cmd_table[i].need_oper && !IsOper (source_p)))
+                       if(stats_cmd_table[i].need_oper && !IsOper(source_p))
                        {
                                sendto_one_numeric(source_p, ERR_NOPRIVILEGES,
                                                   form_str (ERR_NOPRIVILEGES));
                                break;
                        }
+                       if(stats_cmd_table[i].need_admin && !IsOperAdmin(source_p))
+                       {
+                               sendto_one(source_p, form_str(ERR_NOPRIVS),
+                                          me.name, source_p->name, "admin");
+                               break;
+                       }
 
                        /* Blah, stats L needs the parameters, none of the others do.. */
                        if(statchar == 'L' || statchar == 'l')
@@ -263,7 +264,7 @@ stats_delay(struct Client *source_p)
 
        DICTIONARY_FOREACH(nd, &iter, nd_dict)
        {
-               sendto_one_notice(source_p, "Delaying: %s for %ld",
+               sendto_one_notice(source_p, ":Delaying: %s for %ld",
                                nd->name, (long) nd->expire);
        }
 }
@@ -280,7 +281,7 @@ stats_connect(struct Client *source_p)
        static char buf[5];
        struct server_conf *server_p;
        char *s;
-       dlink_node *ptr;
+       rb_dlink_node *ptr;
 
        if((ConfigFileEntry.stats_c_oper_only || 
            (ConfigServerHide.flatten_links && !IsExemptShide(source_p))) &&
@@ -291,7 +292,7 @@ stats_connect(struct Client *source_p)
                return;
        }
 
-       DLINK_FOREACH(ptr, server_conf_list.head)
+       RB_DLINK_FOREACH(ptr, server_conf_list.head)
        {
                server_p = ptr->data;
 
@@ -419,8 +420,8 @@ stats_exempt(struct Client *source_p)
 
        if(ConfigFileEntry.stats_e_disabled)
        {
-               sendto_one_numeric(source_p, ERR_NOPRIVILEGES,
-                                  form_str (ERR_NOPRIVILEGES));
+               sendto_one_numeric(source_p, ERR_DISABLED,
+                                  form_str(ERR_DISABLED), "STATS e");
                return;
        }
 
@@ -459,12 +460,12 @@ stats_pending_glines (struct Client *source_p)
 {
        if(ConfigFileEntry.glines)
        {
-               dlink_node *pending_node;
+               rb_dlink_node *pending_node;
                struct gline_pending *glp_ptr;
                char timebuffer[MAX_DATE_STRING];
                struct tm *tmptr;
 
-               DLINK_FOREACH (pending_node, pending_glines.head)
+               RB_DLINK_FOREACH (pending_node, pending_glines.head)
                {
                        glp_ptr = pending_node->data;
 
@@ -491,7 +492,7 @@ stats_pending_glines (struct Client *source_p)
                        }
                }
 
-               if(dlink_list_length (&pending_glines) > 0)
+               if(rb_dlink_list_length (&pending_glines) > 0)
                        sendto_one_notice(source_p, ":End of Pending G-lines");
        }
        else
@@ -510,10 +511,10 @@ stats_glines (struct Client *source_p)
 {
        if(ConfigFileEntry.glines)
        {
-               dlink_node *gline_node;
+               rb_dlink_node *gline_node;
                struct ConfItem *kill_ptr;
 
-               DLINK_FOREACH_PREV (gline_node, glines.tail)
+               RB_DLINK_FOREACH_PREV (gline_node, glines.tail)
                {
                        kill_ptr = gline_node->data;
 
@@ -535,7 +536,7 @@ static void
 stats_hubleaf(struct Client *source_p)
 {
        struct remote_conf *hub_p;
-       dlink_node *ptr;
+       rb_dlink_node *ptr;
 
        if((ConfigFileEntry.stats_h_oper_only || 
            (ConfigServerHide.flatten_links && !IsExemptShide(source_p))) &&
@@ -546,7 +547,7 @@ stats_hubleaf(struct Client *source_p)
                return;
        }
 
-       DLINK_FOREACH(ptr, hubleaf_conf_list.head)
+       RB_DLINK_FOREACH(ptr, hubleaf_conf_list.head)
        {
                hub_p = ptr->data;
 
@@ -637,21 +638,21 @@ stats_tklines(struct Client *source_p)
                get_printable_kline(source_p, aconf, &host, &pass, &user, &oper_reason);
 
                sendto_one_numeric(source_p, RPL_STATSKLINE, 
-                                  form_str(RPL_STATSKLINE), 'k',
-                                  user, pass, oper_reason ? "|" : "",
+                                  form_str(RPL_STATSKLINE), aconf->flags & CONF_FLAGS_TEMPORARY ? 'k' : 'K',
+                                  host, user, pass, oper_reason ? "|" : "",
                                   oper_reason ? oper_reason : "");
        }
        /* Theyre opered, or allowed to see all klines */
        else
        {
                struct ConfItem *aconf;
-               dlink_node *ptr;
+               rb_dlink_node *ptr;
                int i;
                char *user, *host, *pass, *oper_reason;
 
                for(i = 0; i < LAST_TEMP_TYPE; i++)
                {
-                       DLINK_FOREACH(ptr, temp_klines[i].head)
+                       RB_DLINK_FOREACH(ptr, temp_klines[i].head)
                        {
                                aconf = ptr->data;
 
@@ -696,14 +697,11 @@ stats_klines(struct Client *source_p)
                if(aconf == NULL)
                        return;
 
-               /* dont report a tkline as a kline */
-               if(aconf->flags & CONF_FLAGS_TEMPORARY)
-                       return;
-
                get_printable_kline(source_p, aconf, &host, &pass, &user, &oper_reason);
 
                sendto_one_numeric(source_p, RPL_STATSKLINE, form_str(RPL_STATSKLINE),
-                                  'K', host, user, pass, oper_reason ? "|" : "",
+                                  aconf->flags & CONF_FLAGS_TEMPORARY ? 'k' : 'K',
+                                  host, user, pass, oper_reason ? "|" : "",
                                   oper_reason ? oper_reason : "");
        }
        /* Theyre opered, or allowed to see all klines */
@@ -720,10 +718,10 @@ stats_messages(struct Client *source_p)
 static void
 stats_dnsbl(struct Client *source_p)
 {
-       dlink_node *ptr;
+       rb_dlink_node *ptr;
        struct Blacklist *blptr;
 
-       DLINK_FOREACH(ptr, blacklist_list.head)
+       RB_DLINK_FOREACH(ptr, blacklist_list.head)
        {
                blptr = ptr->data;
 
@@ -740,7 +738,7 @@ static void
 stats_oper(struct Client *source_p)
 {
        struct oper_conf *oper_p;
-       dlink_node *ptr;
+       rb_dlink_node *ptr;
 
        if(!IsOper(source_p) && ConfigFileEntry.stats_o_oper_only)
        {
@@ -749,7 +747,7 @@ stats_oper(struct Client *source_p)
                return;
        }
 
-       DLINK_FOREACH(ptr, oper_conf_list.head)
+       RB_DLINK_FOREACH(ptr, oper_conf_list.head)
        {
                oper_p = ptr->data;
                
@@ -771,10 +769,10 @@ static void
 stats_operedup (struct Client *source_p)
 {
        struct Client *target_p;
-       dlink_node *oper_ptr;
+       rb_dlink_node *oper_ptr;
        unsigned int count = 0;
 
-       DLINK_FOREACH (oper_ptr, oper_list.head)
+       RB_DLINK_FOREACH (oper_ptr, oper_list.head)
        {
                target_p = oper_ptr->data;
 
@@ -812,10 +810,10 @@ static void
 stats_tresv(struct Client *source_p)
 {
        struct ConfItem *aconf;
-       dlink_node *ptr;
+       rb_dlink_node *ptr;
        int i;
 
-       DLINK_FOREACH(ptr, resv_conf_list.head)
+       RB_DLINK_FOREACH(ptr, resv_conf_list.head)
        {
                aconf = ptr->data;
                if(aconf->hold)
@@ -840,10 +838,10 @@ static void
 stats_resv(struct Client *source_p)
 {
        struct ConfItem *aconf;
-       dlink_node *ptr;
+       rb_dlink_node *ptr;
        int i;
 
-       DLINK_FOREACH(ptr, resv_conf_list.head)
+       RB_DLINK_FOREACH(ptr, resv_conf_list.head)
        {
                aconf = ptr->data;
                if(!aconf->hold)
@@ -967,12 +965,12 @@ static void
 stats_shared (struct Client *source_p)
 {
        struct remote_conf *shared_p;
-       dlink_node *ptr;
+       rb_dlink_node *ptr;
        char buf[15];
        char *p;
        int i;
 
-       DLINK_FOREACH(ptr, shared_conf_list.head)
+       RB_DLINK_FOREACH(ptr, shared_conf_list.head)
        {
                shared_p = ptr->data;
 
@@ -994,7 +992,7 @@ stats_shared (struct Client *source_p)
                                        shared_p->host, buf);
        }
 
-       DLINK_FOREACH(ptr, cluster_conf_list.head)
+       RB_DLINK_FOREACH(ptr, cluster_conf_list.head)
        {
                shared_p = ptr->data;
 
@@ -1026,7 +1024,7 @@ static void
 stats_servers (struct Client *source_p)
 {
        struct Client *target_p;
-       dlink_node *ptr;
+       rb_dlink_node *ptr;
        time_t seconds;
        int days, hours, minutes;
        int j = 0;
@@ -1039,7 +1037,7 @@ stats_servers (struct Client *source_p)
                return;
        }
 
-       DLINK_FOREACH (ptr, serv_list.head)
+       RB_DLINK_FOREACH (ptr, serv_list.head)
        {
                target_p = ptr->data;
 
@@ -1072,9 +1070,9 @@ static void
 stats_tgecos(struct Client *source_p)
 {
        struct ConfItem *aconf;
-       dlink_node *ptr;
+       rb_dlink_node *ptr;
 
-       DLINK_FOREACH(ptr, xline_conf_list.head)
+       RB_DLINK_FOREACH(ptr, xline_conf_list.head)
        {
                aconf = ptr->data;
 
@@ -1090,9 +1088,9 @@ static void
 stats_gecos(struct Client *source_p)
 {
        struct ConfItem *aconf;
-       dlink_node *ptr;
+       rb_dlink_node *ptr;
 
-       DLINK_FOREACH(ptr, xline_conf_list.head)
+       RB_DLINK_FOREACH(ptr, xline_conf_list.head)
        {
                aconf = ptr->data;
 
@@ -1123,11 +1121,11 @@ stats_memory (struct Client *source_p)
 static void
 stats_ziplinks (struct Client *source_p)
 {
-       dlink_node *ptr;
+       rb_dlink_node *ptr;
        struct Client *target_p;
        int sent_data = 0;
 
-       DLINK_FOREACH (ptr, serv_list.head)
+       RB_DLINK_FOREACH (ptr, serv_list.head)
        {
                target_p = ptr->data;
                if(IsCapable (target_p, CAP_ZIP))
@@ -1160,7 +1158,7 @@ stats_servlinks (struct Client *source_p)
        static char Sformat[] = ":%s %d %s %s %u %u %u %u %u :%u %u %s";
        long uptime, sendK, receiveK;
        struct Client *target_p;
-       dlink_node *ptr;
+       rb_dlink_node *ptr;
        int j = 0;
 
        if(ConfigServerHide.flatten_links && !IsOper (source_p) &&
@@ -1173,7 +1171,7 @@ stats_servlinks (struct Client *source_p)
 
        sendK = receiveK = 0;
 
-       DLINK_FOREACH (ptr, serv_list.head)
+       RB_DLINK_FOREACH (ptr, serv_list.head)
        {
                target_p = ptr->data;
 
@@ -1309,16 +1307,16 @@ stats_ltrace(struct Client *source_p, int parc, const char *parv[])
 
 static void
 stats_l_list(struct Client *source_p, const char *name, int doall, int wilds,
-            dlink_list * list, char statchar)
+            rb_dlink_list * list, char statchar)
 {
-       dlink_node *ptr;
+       rb_dlink_node *ptr;
        struct Client *target_p;
 
        /* send information about connections which match.  note, we
         * dont need tests for IsInvisible(), because non-opers will
         * never get here for normal clients --fl
         */
-       DLINK_FOREACH(ptr, list->head)
+       RB_DLINK_FOREACH(ptr, list->head)
        {
                target_p = ptr->data;
 
@@ -1368,6 +1366,20 @@ stats_l_client(struct Client *source_p, struct Client *target_p,
        }
 }
 
+static void\r
+rb_dump_fd_callback(int fd, const char *desc, void *data)\r
+{\r
+       struct Client *source_p = data;\r
+       sendto_one_numeric(source_p, RPL_STATSDEBUG, "F :fd %-3d desc '%s'", fd, desc);\r
+}\r
+\r
+static void\r
+stats_comm(struct Client *source_p)\r
+{\r
+       rb_dump_fd(rb_dump_fd_callback, source_p);\r
+       send_pop_queue(source_p);\r
+}
+
 /*
  * stats_spy
  *