#include "s_stats.h"
#include "class.h"
#include "client.h"
-#include "crule.h"
#include "ircd.h"
#include "ircd_chattr.h"
#include "ircd_reply.h"
"m - Message usage information.",
"t - Local connection statistics (Total SND/RCV, etc).",
"w - Userload statistics.",
+ "v - Connection class information.",
"M - Memory allocation & leak monitoring.",
"z - Memory/Structure allocation information.",
"r - System resource usage (Debug only).",
{CONF_OPERATOR, RPL_STATSOLINE, 'O'},
{CONF_HUB, RPL_STATSHLINE, 'H'},
{CONF_LOCOP, RPL_STATSOLINE, 'o'},
- {CONF_CRULEALL, RPL_STATSDLINE, 'D'},
- {CONF_CRULEAUTO, RPL_STATSDLINE, 'd'},
{CONF_UWORLD, RPL_STATSULINE, 'U'},
- {CONF_TLINES, RPL_STATSTLINE, 'T'},
{0, 0}
};
*/
/* Special-case 'k' or 'K' lines as appropriate... -Kev */
if ((tmp->status & CONF_KLINE))
- sendto_one(sptr, rpl_str(p[1]), me.name,
- sptr->name, c, host, pass, name, port, get_conf_class(tmp));
- /*
- * connect rules are classless
- */
- else if ((tmp->status & CONF_CRULE))
- sendto_one(sptr, rpl_str(p[1]), me.name, sptr->name, c, host, name);
- else if ((tmp->status & CONF_TLINES))
- sendto_one(sptr, rpl_str(p[1]), me.name, sptr->name, c, host, pass);
+ send_reply(sptr, p[1], c, host, pass, name, port, get_conf_class(tmp));
else if ((tmp->status & CONF_UWORLD))
- sendto_one(sptr, rpl_str(p[1]),
- me.name, sptr->name, c, host, pass, name, port,
- get_conf_class(tmp));
+ send_reply(sptr, p[1], c, host, pass, name, port, get_conf_class(tmp));
else if ((tmp->status & (CONF_SERVER | CONF_HUB)))
- sendto_one(sptr, rpl_str(p[1]), me.name, sptr->name, c, "*", name,
- port, get_conf_class(tmp));
+ send_reply(sptr, p[1], c, "*", name, port, get_conf_class(tmp));
else
- sendto_one(sptr, rpl_str(p[1]), me.name, sptr->name, c, host, name,
- port, get_conf_class(tmp));
+ send_reply(sptr, p[1], c, host, name, port, get_conf_class(tmp));
}
}
}
+/*
+ * {CONF_TLINES, RPL_STATSTLINE, 'T'},
+ */
+void report_motd_list(struct Client* to)
+{
+ const struct MotdConf* conf = conf_get_motd_list();
+ for ( ; conf; conf = conf->next)
+ send_reply(to, RPL_STATSTLINE, 'T', conf->hostmask, conf->path);
+}
+
+/*
+ * {CONF_CRULEALL, RPL_STATSDLINE, 'D'},
+ * {CONF_CRULEAUTO, RPL_STATSDLINE, 'd'},
+ */
+void report_crule_list(struct Client* to, int mask)
+{
+ const struct CRuleConf* p = conf_get_crule_list();
+ for ( ; p; p = p->next) {
+ if (0 != (p->type & mask))
+ send_reply(to, RPL_STATSDLINE, (CRULE_ALL == p->type) ? 'D' : 'd', p->hostmask, p->rule);
+ }
+}
+
/* m_stats is so obnoxiously full of special cases that the different
* hunt_server() possiblites were becoming very messy. It now uses a
* switch() so as to be easier to read and update as params change.
/* open to all, standard # of params */
case 'U':
case 'u':
- return hunt_server(0, cptr, sptr, "%s%s " TOK_STATS " %s :%s", 2, parc, parv);
+ return hunt_server_cmd(sptr, CMD_STATS, cptr, 0, "%s :%C", 2, parc,
+ parv);
/* open to all, varying # of params */
case 'k':
case 'P':
{
if (parc > 3)
- return hunt_server(0, cptr, sptr, "%s%s " TOK_STATS " %s %s :%s", 2, parc, parv);
+ return hunt_server_cmd(sptr, CMD_STATS, cptr, 0, "%s %C :%s", 2, parc, parv);
else
- return hunt_server(0, cptr, sptr, "%s%s " TOK_STATS " %s :%s", 2, parc, parv);
+ return hunt_server_cmd(sptr, CMD_STATS, cptr, 0, "%s :%C", 2, parc, parv);
}
/* oper only, varying # of params */
case 'M':
{
if (parc == 4)
- return hunt_server(1, cptr, sptr, "%s%s " TOK_STATS " %s %s :%s", 2, parc, parv);
+ return hunt_server_cmd(sptr, CMD_STATS, cptr, 1, "%s %C :%s", 2, parc, parv);
else if (parc > 4)
- return hunt_server(1, cptr, sptr, "%s%s " TOK_STATS " %s %s %s :%s", 2, parc, parv);
+ return hunt_server_cmd(sptr, CMD_STATS, cptr, 1, "%s %C %s :%s", 2, parc, parv);
else
- return hunt_server(1, cptr, sptr, "%s%s " TOK_STATS " %s :%s", 2, parc, parv);
+ return hunt_server_cmd(sptr, CMD_STATS, cptr, 1, "%s :%C", 2, parc, parv);
}
/* oper only, standard # of params */
default:
- return hunt_server(1, cptr, sptr, "%s%s " TOK_STATS " %s :%s", 2, parc, parv);
+ return hunt_server_cmd(sptr, CMD_STATS, cptr, 1, "%s :%C", 2, parc, parv);
}
}