Provide /stats F to report even defaulted feature values.
authorMichael Poole <mdpoole@troilus.org>
Sat, 2 Jan 2010 04:00:13 +0000 (04:00 +0000)
committerMichael Poole <mdpoole@troilus.org>
Sat, 2 Jan 2010 04:00:13 +0000 (04:00 +0000)
(Apply patch #2693259, inspired by a Quakenet patch by paulr.)

git-svn-id: file:///home/klmitch/undernet-ircu/undernet-ircu-svn/ircu2/branches/u2_10_12_branch@1922 c9e4aea6-c8fd-4c43-8297-357d70d61c8c

ChangeLog
ircd/ircd_features.c
ircd/s_stats.c

index 734e05f0e2e671d8576cb99f08907832ff49e023..91fab17519c16b6baf6c84992ec0c531e5735486 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2010-01-01  Michael Poole <mdpoole@troilus.org>
+
+       * ircd/ircd_features.c (feature_report): If sd->sd_funcdata is
+       non-zero, report even unchanged features (using prefix 'f').
+
+       * ircd/s_stats.c (statsinfo): Make "/stats f" case-sensitive, and
+       use the upper case variant to report all features.
+
 2009-07-30  Michael Poole <mdpoole@troilus.org>
 
        * ircd/s_user.c (register_user): Move the default-usermodes call
index f49539cbddf79257a6cdf7864364ebec76e2f3e0..baaa2bd0e146c1763d735681c8bf57bffed8060c 100644 (file)
@@ -41,6 +41,7 @@
 #include "s_bsd.h"
 #include "s_debug.h"
 #include "s_misc.h"
+#include "s_stats.h"
 #include "send.h"
 #include "struct.h"
 #include "sys.h"    /* FALSE bleah */
@@ -819,6 +820,8 @@ feature_init(void)
 void
 feature_report(struct Client* to, const struct StatDesc* sd, char* param)
 {
+  char changed;
+  int report;
   int i;
 
   for (i = 0; features[i].type; i++) {
@@ -827,33 +830,36 @@ feature_report(struct Client* to, const struct StatDesc* sd, char* param)
        (features[i].flags & FEAT_OPER && !IsAnOper(to)))
       continue; /* skip this one */
 
+    changed = (features[i].flags & FEAT_MARK) ? 'F' : 'f';
+    report = (features[i].flags & FEAT_MARK) || sd->sd_funcdata;
+
     switch (features[i].flags & FEAT_MASK) {
     case FEAT_NONE:
       if (features[i].report) /* let the callback handle this */
-       (*features[i].report)(to, features[i].flags & FEAT_MARK ? 1 : 0);
+       (*features[i].report)(to, report);
       break;
 
 
     case FEAT_INT: /* Report an F-line with integer values */
-      if (features[i].flags & FEAT_MARK) /* it's been changed */
-       send_reply(to, SND_EXPLICIT | RPL_STATSFLINE, "F %s %d",
-                  features[i].type, features[i].v_int);
+      if (report) /* it's been changed */
+       send_reply(to, SND_EXPLICIT | RPL_STATSFLINE, "%c %s %d",
+                  changed, features[i].type, features[i].v_int);
       break;
 
     case FEAT_BOOL: /* Report an F-line with boolean values */
-      if (features[i].flags & FEAT_MARK) /* it's been changed */
-       send_reply(to, SND_EXPLICIT | RPL_STATSFLINE, "F %s %s",
-                  features[i].type, features[i].v_int ? "TRUE" : "FALSE");
+      if (report) /* it's been changed */
+       send_reply(to, SND_EXPLICIT | RPL_STATSFLINE, "%c %s %s",
+                  changed, features[i].type, features[i].v_int ? "TRUE" : "FALSE");
       break;
 
     case FEAT_STR: /* Report an F-line with string values */
-      if (features[i].flags & FEAT_MARK) { /* it's been changed */
+      if (report) { /* it's been changed */
        if (features[i].v_str)
-         send_reply(to, SND_EXPLICIT | RPL_STATSFLINE, "F %s %s",
-                    features[i].type, features[i].v_str);
+         send_reply(to, SND_EXPLICIT | RPL_STATSFLINE, "%c %s %s",
+                    changed, features[i].type, features[i].v_str);
        else /* Actually, F:<type> would reset it; you want F:<type>: */
-         send_reply(to, SND_EXPLICIT | RPL_STATSFLINE, "F %s",
-                    features[i].type);
+         send_reply(to, SND_EXPLICIT | RPL_STATSFLINE, "%c %s",
+                    changed, features[i].type);
       }
       break;
     }
index 1022b0cb6dbac6e6754d4fa76745d9a90d66394a..c3f01cd7c43abc0e64b5c2c5fe01dc748d253a47 100644 (file)
@@ -544,9 +544,12 @@ struct StatDesc statsinfo[] = {
   { 'e', "engine", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_e,
     stats_engine, 0,
     "Report server event loop engine." },
-  { 'f', "features", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_f,
+  { 'f', "features", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), FEAT_HIS_STATS_f,
     feature_report, 0,
     "Feature settings." },
+  { 'F', "featuresall", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), FEAT_HIS_STATS_f,
+    feature_report, 1,
+    "All feature settings, including defaulted values." },
   { 'g', "glines", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_g,
     gline_stats, 0,
     "Global bans (G-lines)." },