Committer  : klmitch
CVSROOT    : /cvsroot/undernet-ircu
Module     : ircu2.10
Commit time: 2006-06-01 15:59:29 UTC

Modified files:
     ChangeLog doc/example.conf doc/readme.features
     include/ircd_features.h ircd/ircd_features.c ircd/s_stats.c

Log message:

Author: Kev <[EMAIL PROTECTED]>
Log message:

Add support for deprecating features and/or changing their names; use these
facilities to change the case-sensitive names of HIS_STATS_? features to
non-case-sensitive names using the long version of the /stats.  The next
major release should remove the old HIS_STATS_? feature names and revert
the feature system to case-insensitive matching.

---------------------- diff included ----------------------
Index: ircu2.10/ChangeLog
diff -u ircu2.10/ChangeLog:1.775 ircu2.10/ChangeLog:1.776
--- ircu2.10/ChangeLog:1.775    Mon May 15 20:37:38 2006
+++ ircu2.10/ChangeLog  Thu Jun  1 08:59:18 2006
@@ -1,3 +1,26 @@
+2006-06-01  Kevin L. Mitchell  <[EMAIL PROTECTED]>
+
+       * ircd/ircd_features.c: add FEAT_DEP to mark deprecated features
+       with no replacement; create and use feat_type() macro to extract
+       the type of a feature from its flags
+
+       * doc/readme.features: update for new HIS_STATS_* names
+
+       * doc/example.conf: update for new HIS_STATS_* names
+
+2006-05-31  Kevin L. Mitchell  <[EMAIL PROTECTED]>
+
+       * ircd/s_stats.c: use new names for controlling features
+
+       * ircd/ircd_features.c: add support for deprecated aliases for
+       features--allows a feature to be accessed by user or .conf by two
+       names, but warns when the deprecated name is used; change all
+       HIS_STATS_? features to aliases for the new names; remove
+       unnecessary HIS_STATS_M
+
+       * include/ircd_features.h: add features covering new names for
+       FEAT_HIS_STATS_?; remove unnecessary FEAT_HIS_STATS_M
+
 2006-05-15  Michael Poole <[EMAIL PROTECTED]>
 
        * ircd/s_auth.c (check_auth_finished): Only check passwords on
Index: ircu2.10/doc/example.conf
diff -u ircu2.10/doc/example.conf:1.68 ircu2.10/doc/example.conf:1.69
--- ircu2.10/doc/example.conf:1.68      Sun May 14 12:31:30 2006
+++ ircu2.10/doc/example.conf   Thu Jun  1 08:59:18 2006
@@ -818,34 +818,33 @@
 #  "HIS_MAP" = "TRUE";
 #  "HIS_LINKS" = "TRUE";
 #  "HIS_TRACE" = "TRUE";
-#  "HIS_STATS_a" = "TRUE";
-#  "HIS_STATS_c" = "TRUE";
-#  "HIS_STATS_d" = "TRUE";
-#  "HIS_STATS_e" = "TRUE";
-#  "HIS_STATS_f" = "TRUE";
-#  "HIS_STATS_g" = "TRUE";
-#  "HIS_STATS_i" = "TRUE";
-#  "HIS_STATS_j" = "TRUE";
-#  "HIS_STATS_J" = "TRUE";
-#  "HIS_STATS_k" = "TRUE";
-#  "HIS_STATS_l" = "TRUE";
-#  "HIS_STATS_L" = "TRUE";
-#  "HIS_STATS_m" = "TRUE";
-#  "HIS_STATS_M" = "TRUE";
-#  "HIS_STATS_o" = "TRUE";
-#  "HIS_STATS_p" = "TRUE";
-#  "HIS_STATS_q" = "TRUE";
-#  "HIS_STATS_r" = "TRUE";
-#  "HIS_STATS_R" = "TRUE";
-#  "HIS_STATS_t" = "TRUE";
-#  "HIS_STATS_T" = "TRUE";
-#  "HIS_STATS_u" = "FALSE";
-#  "HIS_STATS_U" = "TRUE";
-#  "HIS_STATS_v" = "TRUE";
-#  "HIS_STATS_w" = "TRUE";
-#  "HIS_STATS_x" = "TRUE";
-#  "HIS_STATS_y" = "TRUE";
-#  "HIS_STATS_z" = "TRUE";
+#  "HIS_STATS_NAMESERVERS" = "TRUE";
+#  "HIS_STATS_CONNECT" = "TRUE";
+#  "HIS_STATS_CRULES" = "TRUE";
+#  "HIS_STATS_ENGINE" = "TRUE";
+#  "HIS_STATS_FEATURES" = "TRUE";
+#  "HIS_STATS_GLINES" = "TRUE";
+#  "HIS_STATS_ACCESS" = "TRUE";
+#  "HIS_STATS_HISTOGRAM" = "TRUE";
+#  "HIS_STATS_JUPES" = "TRUE";
+#  "HIS_STATS_KLINES" = "TRUE";
+#  "HIS_STATS_LINKS" = "TRUE";
+#  "HIS_STATS_MODULES" = "TRUE";
+#  "HIS_STATS_COMMANDS" = "TRUE";
+#  "HIS_STATS_OPERATORS" = "TRUE";
+#  "HIS_STATS_PORTS" = "TRUE";
+#  "HIS_STATS_QUARANTINES" = "TRUE";
+#  "HIS_STATS_MAPPINGS" = "TRUE";
+#  "HIS_STATS_USAGE" = "TRUE";
+#  "HIS_STATS_LOCALS" = "TRUE";
+#  "HIS_STATS_MOTDS" = "TRUE";
+#  "HIS_STATS_UPTIME" = "FALSE";
+#  "HIS_STATS_UWORLD" = "TRUE";
+#  "HIS_STATS_VSERVERS" = "TRUE";
+#  "HIS_STATS_USERLOAD" = "TRUE";
+#  "HIS_STATS_MEMUSAGE" = "TRUE";
+#  "HIS_STATS_CLASSES" = "TRUE";
+#  "HIS_STATS_MEMORY" = "TRUE";
 #  "HIS_STATS_IAUTH" = "TRUE";
 #  "HIS_WHOIS_SERVERNAME" = "TRUE";
 #  "HIS_WHOIS_IDLETIME" = "TRUE";
Index: ircu2.10/doc/readme.features
diff -u ircu2.10/doc/readme.features:1.23 ircu2.10/doc/readme.features:1.24
--- ircu2.10/doc/readme.features:1.23   Thu Apr  6 20:27:51 2006
+++ ircu2.10/doc/readme.features        Thu Jun  1 08:59:19 2006
@@ -486,169 +486,163 @@
 
 As per UnderNet CFV-165, this removes /TRACE from users.
 
-HIS_STATS_a
+HIS_STATS_NAMESERVERS
  * Type: boolean
  * Default: TRUE
 
 As per UnderNet CFV-165, this removes /STATS a from users.
 
-HIS_STATS_l
+HIS_STATS_LINKS
  * Type: boolean
  * Default: TRUE
 
 As per UnderNet CFV-165, this removes /STATS l from users.
 
-HIS_STATS_L
+HIS_STATS_MODULES
  * Type: boolean
  * Default: TRUE
 
 As per UnderNet CFV-165, this removes /STATS L from users.
 
-HIS_STATS_c
+HIS_STATS_CONNECT
  * Type: boolean
  * Default: TRUE
 
 As per UnderNet CFV-165, this removes /STATS c from users.
 
-HIS_STATS_g
+HIS_STATS_GLINES
  * Type: boolean
  * Default: TRUE
 
 As per UnderNet CFV-165, this removes /STATS g from users.
 
-HIS_STATS_k
+HIS_STATS_KLINES
  * Type: boolean
  * Default: TRUE
 
 As per UnderNet CFV-165, this removes /STATS k from users.
 
-HIS_STATS_f
+HIS_STATS_FEATURES
  * Type: boolean
  * Default: TRUE
 
 As per UnderNet CFV-165, this removes /STATS f from users.
 
-HIS_STATS_i
+HIS_STATS_ACCESS
  * Type: boolean
  * Default: TRUE
 
 As per UnderNet CFV-165, this removes /STATS i from users.
 
-HIS_STATS_j
+HIS_STATS_HISTOGRAM
  * Type: boolean
  * Default: TRUE
 
 As per UnderNet CFV-165, this removes /STATS j from users.
 
-HIS_STATS_J
+HIS_STATS_JUPES
  * Type: boolean
  * Default: TRUE
 
 As per UnderNet CFV-165, this removes /STATS J from users.
 
-HIS_STATS_M
- * Type: boolean
- * Default: TRUE
-
-As per UnderNet CFV-165, this removes /STATS M from users.
-
-HIS_STATS_m
+HIS_STATS_COMMANDS
  * Type: boolean
  * Default: TRUE
 
 As per UnderNet CFV-165, this removes /STATS m from users.
 
-HIS_STATS_o
+HIS_STATS_OPERATORS
  * Type: boolean
  * Default: TRUE
 
 As per UnderNet CFV-165, this removes /STATS o from users.
 
-HIS_STATS_p
+HIS_STATS_PORTS
  * Type: boolean
  * Default: TRUE
 
 As per UnderNet CFV-165, this removes /STATS p from users.
 
-HIS_STATS_q
+HIS_STATS_QUARANTINES
  * Type: boolean
  * Default: TRUE
 
 As per UnderNet CFV-165, this removes /STATS q from users.
 
-HIS_STATS_r
+HIS_STATS_USAGE
  * Type: boolean
  * Default: TRUE
 
 As per UnderNet CFV-165, this removes /STATS r from users.
 
-HIS_STATS_R
+HIS_STATS_MAPPINGS
  * Type: boolean
  * Default: TRUE
 
 As per UnderNet CFV-165, this removes /STATS R from users.
 
-HIS_STATS_d
+HIS_STATS_CRULES
  * Type: boolean
  * Default: TRUE
 
 As per UnderNet CFV-165, this removes /STATS d from users.
 
-HIS_STATS_e
+HIS_STATS_ENGINE
  * Type: boolean
  * Default: TRUE
 
 As per UnderNet CFV-165, this removes /STATS e from users.
 
-HIS_STATS_t
+HIS_STATS_LOCALS
  * Type: boolean
  * Default: TRUE
 
 As per UnderNet CFV-165, this removes /STATS t from users.
 
-HIS_STATS_T
+HIS_STATS_MOTDS
  * Type: boolean
  * Default: TRUE
 
 As per UnderNet CFV-165, this removes /STATS T from users.
 
-HIS_STATS_u
+HIS_STATS_UPTIME
  * Type: boolean
  * Default: FALSE
 
 As per UnderNet CFV-165, this allows users to perform /STATS u.
 
-HIS_STATS_U
+HIS_STATS_UWORLD
  * Type: boolean
  * Default: TRUE
 
 As per UnderNet CFV-165, this removes /STATS U from users.
 
-HIS_STATS_v
+HIS_STATS_VSERVERS
  * Type: boolean
  * Default: TRUE
 
 As per UnderNet CFV-165, this removes /STATS v from users.
 
-HIS_STATS_w
+HIS_STATS_USERLOAD
  * Type: boolean
  * Default: FALSE
 
 As per UnderNet CFV-165, this allows users to perform /STATS w.
 
-HIS_STATS_x
+HIS_STATS_MEMUSAGE
  * Type: boolean
  * Default: TRUE
 
 As per UnderNet CFV-165, this removes /STATS x from users.
 
-HIS_STATS_y
+HIS_STATS_CLASSES
  * Type: boolean
  * Default: TRUE
 
 As per UnderNet CFV-165, this removes /STATS y from users.
 
-HIS_STATS_z
+HIS_STATS_MEMORY
  * Type: boolean
  * Default: TRUE
 
Index: ircu2.10/include/ircd_features.h
diff -u ircu2.10/include/ircd_features.h:1.42 
ircu2.10/include/ircd_features.h:1.43
--- ircu2.10/include/ircd_features.h:1.42       Thu Apr  6 20:27:51 2006
+++ ircu2.10/include/ircd_features.h    Thu Jun  1 08:59:19 2006
@@ -20,7 +20,7 @@
  */
 /** @file
  * @brief Public interfaces and declarations for dealing with configurable 
features.
- * @version $Id: ircd_features.h,v 1.42 2006/04/07 03:27:51 entrope Exp $
+ * @version $Id: ircd_features.h,v 1.43 2006/06/01 15:59:19 klmitch Exp $
  */
 
 struct Client;
@@ -109,33 +109,59 @@
   FEAT_HIS_LINKS,
   FEAT_HIS_TRACE,
   FEAT_HIS_STATS_a,
+  FEAT_HIS_STATS_NAMESERVERS,
   FEAT_HIS_STATS_c,
+  FEAT_HIS_STATS_CONNECT,
   FEAT_HIS_STATS_d,
+  FEAT_HIS_STATS_CRULES,
   FEAT_HIS_STATS_e,
+  FEAT_HIS_STATS_ENGINE,
   FEAT_HIS_STATS_f,
+  FEAT_HIS_STATS_FEATURES,
   FEAT_HIS_STATS_g,
+  FEAT_HIS_STATS_GLINES,
   FEAT_HIS_STATS_i,
+  FEAT_HIS_STATS_ACCESS,
   FEAT_HIS_STATS_j,
+  FEAT_HIS_STATS_HISTOGRAM,
   FEAT_HIS_STATS_J,
+  FEAT_HIS_STATS_JUPES,
   FEAT_HIS_STATS_k,
+  FEAT_HIS_STATS_KLINES,
   FEAT_HIS_STATS_l,
+  FEAT_HIS_STATS_LINKS,
   FEAT_HIS_STATS_L,
-  FEAT_HIS_STATS_M,
+  FEAT_HIS_STATS_MODULES,
   FEAT_HIS_STATS_m,
+  FEAT_HIS_STATS_COMMANDS,
   FEAT_HIS_STATS_o,
+  FEAT_HIS_STATS_OPERATORS,
   FEAT_HIS_STATS_p,
+  FEAT_HIS_STATS_PORTS,
   FEAT_HIS_STATS_q,
+  FEAT_HIS_STATS_QUARANTINES,
   FEAT_HIS_STATS_R,
+  FEAT_HIS_STATS_MAPPINGS,
   FEAT_HIS_STATS_r,
+  FEAT_HIS_STATS_USAGE,
   FEAT_HIS_STATS_t,
+  FEAT_HIS_STATS_LOCALS,
   FEAT_HIS_STATS_T,
+  FEAT_HIS_STATS_MOTDS,
   FEAT_HIS_STATS_u,
+  FEAT_HIS_STATS_UPTIME,
   FEAT_HIS_STATS_U,
+  FEAT_HIS_STATS_UWORLD,
   FEAT_HIS_STATS_v,
+  FEAT_HIS_STATS_VSERVERS,
   FEAT_HIS_STATS_w,
+  FEAT_HIS_STATS_USERLOAD,
   FEAT_HIS_STATS_x,
+  FEAT_HIS_STATS_MEMUSAGE,
   FEAT_HIS_STATS_y,
+  FEAT_HIS_STATS_CLASSES,
   FEAT_HIS_STATS_z,
+  FEAT_HIS_STATS_MEMORY,
   FEAT_HIS_STATS_IAUTH,
   FEAT_HIS_WHOIS_SERVERNAME,
   FEAT_HIS_WHOIS_IDLETIME,
Index: ircu2.10/ircd/ircd_features.c
diff -u ircu2.10/ircd/ircd_features.c:1.56 ircu2.10/ircd/ircd_features.c:1.57
--- ircu2.10/ircd/ircd_features.c:1.56  Thu Apr  6 20:27:50 2006
+++ ircu2.10/ircd/ircd_features.c       Thu Jun  1 08:59:19 2006
@@ -18,7 +18,7 @@
  */
 /** @file
  * @brief Implementation of configurable feature support.
- * @version $Id: ircd_features.c,v 1.56 2006/04/07 03:27:50 entrope Exp $
+ * @version $Id: ircd_features.c,v 1.57 2006/06/01 15:59:19 klmitch Exp $
  */
 #include "config.h"
 
@@ -286,8 +286,13 @@
 #define FEAT_INT    0x0001     /**< set if entry contains an integer value */
 #define FEAT_BOOL   0x0002     /**< set if entry contains a boolean value */
 #define FEAT_STR    0x0003     /**< set if entry contains a string value */
+#define FEAT_ALIAS  0x0004     /**< set if entry is alias for another entry */
+#define FEAT_DEP    0x0005     /**< set if entry is deprecated feature */
 #define FEAT_MASK   0x000f     /**< possible value types */
 
+/** Extract just the feature type from a feature descriptor. */
+#define feat_type(feat)                ((feat)->flags & FEAT_MASK)
+
 #define FEAT_MARK   0x0010     /**< set if entry has been changed */
 #define FEAT_NULL   0x0020     /**< NULL string is permitted */
 #define FEAT_CASE   0x0040     /**< string is case-sensitive */
@@ -314,6 +319,13 @@
 #define F_S(type, flags, v_str, notify)                                        
      \
   { FEAT_ ## type, #type, FEAT_STR | (flags), 0, 0, 0, (v_str),                
      \
     0, 0, 0, (notify), 0, 0, 0 }
+/** Declare a feature as an alias for another feature. */
+#define F_A(type, alias)                                                     \
+  { FEAT_ ## type, #type, FEAT_ALIAS, 0, FEAT_ ## alias, 0, 0,               \
+    0, 0, 0, 0, 0, 0, 0 }
+/** Declare a feature as deprecated. */
+#define F_D(type)                                                            \
+  { FEAT_ ## type, #type, FEAT_DEP, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
 
 /** Table of feature descriptions. */
 static struct FeatureDesc {
@@ -409,34 +421,60 @@
   F_B(HIS_MAP, 0, 1, 0),
   F_B(HIS_LINKS, 0, 1, 0),
   F_B(HIS_TRACE, 0, 1, 0),
-  F_B(HIS_STATS_a, 0, 1, 0),
-  F_B(HIS_STATS_c, 0, 1, 0),
-  F_B(HIS_STATS_d, 0, 1, 0),
-  F_B(HIS_STATS_e, 0, 1, 0),
-  F_B(HIS_STATS_f, 0, 1, 0),
-  F_B(HIS_STATS_g, 0, 1, 0),
-  F_B(HIS_STATS_i, 0, 1, 0),
-  F_B(HIS_STATS_j, 0, 1, 0),
-  F_B(HIS_STATS_J, 0, 1, 0),
-  F_B(HIS_STATS_k, 0, 1, 0),
-  F_B(HIS_STATS_l, 0, 1, 0),
-  F_B(HIS_STATS_L, 0, 1, 0),
-  F_B(HIS_STATS_M, 0, 1, 0),
-  F_B(HIS_STATS_m, 0, 1, 0),
-  F_B(HIS_STATS_o, 0, 1, 0),
-  F_B(HIS_STATS_p, 0, 1, 0),
-  F_B(HIS_STATS_q, 0, 1, 0),
-  F_B(HIS_STATS_R, 0, 1, 0),
-  F_B(HIS_STATS_r, 0, 1, 0),
-  F_B(HIS_STATS_t, 0, 1, 0),
-  F_B(HIS_STATS_T, 0, 1, 0),
-  F_B(HIS_STATS_u, 0, 0, 0),
-  F_B(HIS_STATS_U, 0, 1, 0),
-  F_B(HIS_STATS_v, 0, 1, 0),
-  F_B(HIS_STATS_w, 0, 0, 0),
-  F_B(HIS_STATS_x, 0, 1, 0),
-  F_B(HIS_STATS_y, 0, 1, 0),
-  F_B(HIS_STATS_z, 0, 1, 0),
+  F_A(HIS_STATS_a, HIS_STATS_NAMESERVERS),
+  F_B(HIS_STATS_NAMESERVERS, 0, 1, 0),
+  F_A(HIS_STATS_c, HIS_STATS_CONNECT),
+  F_B(HIS_STATS_CONNECT, 0, 1, 0),
+  F_A(HIS_STATS_d, HIS_STATS_CRULES),
+  F_B(HIS_STATS_CRULES, 0, 1, 0),
+  F_A(HIS_STATS_e, HIS_STATS_ENGINE),
+  F_B(HIS_STATS_ENGINE, 0, 1, 0),
+  F_A(HIS_STATS_f, HIS_STATS_FEATURES),
+  F_B(HIS_STATS_FEATURES, 0, 1, 0),
+  F_A(HIS_STATS_g, HIS_STATS_GLINES),
+  F_B(HIS_STATS_GLINES, 0, 1, 0),
+  F_A(HIS_STATS_i, HIS_STATS_ACCESS),
+  F_B(HIS_STATS_ACCESS, 0, 1, 0),
+  F_A(HIS_STATS_j, HIS_STATS_HISTOGRAM),
+  F_B(HIS_STATS_HISTOGRAM, 0, 1, 0),
+  F_A(HIS_STATS_J, HIS_STATS_JUPES),
+  F_B(HIS_STATS_JUPES, 0, 1, 0),
+  F_A(HIS_STATS_k, HIS_STATS_KLINES),
+  F_B(HIS_STATS_KLINES, 0, 1, 0),
+  F_A(HIS_STATS_l, HIS_STATS_LINKS),
+  F_B(HIS_STATS_LINKS, 0, 1, 0),
+  F_A(HIS_STATS_L, HIS_STATS_MODULES),
+  F_B(HIS_STATS_MODULES, 0, 1, 0),
+  F_A(HIS_STATS_m, HIS_STATS_COMMANDS),
+  F_B(HIS_STATS_COMMANDS, 0, 1, 0),
+  F_A(HIS_STATS_o, HIS_STATS_OPERATORS),
+  F_B(HIS_STATS_OPERATORS, 0, 1, 0),
+  F_A(HIS_STATS_p, HIS_STATS_PORTS),
+  F_B(HIS_STATS_PORTS, 0, 1, 0),
+  F_A(HIS_STATS_q, HIS_STATS_QUARANTINES),
+  F_B(HIS_STATS_QUARANTINES, 0, 1, 0),
+  F_A(HIS_STATS_R, HIS_STATS_MAPPINGS),
+  F_B(HIS_STATS_MAPPINGS, 0, 1, 0),
+  F_A(HIS_STATS_r, HIS_STATS_USAGE),
+  F_B(HIS_STATS_USAGE, 0, 1, 0),
+  F_A(HIS_STATS_t, HIS_STATS_LOCALS),
+  F_B(HIS_STATS_LOCALS, 0, 1, 0),
+  F_A(HIS_STATS_T, HIS_STATS_MOTDS),
+  F_B(HIS_STATS_MOTDS, 0, 1, 0),
+  F_A(HIS_STATS_u, HIS_STATS_UPTIME),
+  F_B(HIS_STATS_UPTIME, 0, 0, 0),
+  F_A(HIS_STATS_U, HIS_STATS_UWORLD),
+  F_B(HIS_STATS_UWORLD, 0, 1, 0),
+  F_A(HIS_STATS_v, HIS_STATS_VSERVERS),
+  F_B(HIS_STATS_VSERVERS, 0, 1, 0),
+  F_A(HIS_STATS_w, HIS_STATS_USERLOAD),
+  F_B(HIS_STATS_USERLOAD, 0, 0, 0),
+  F_A(HIS_STATS_x, HIS_STATS_MEMUSAGE),
+  F_B(HIS_STATS_MEMUSAGE, 0, 1, 0),
+  F_A(HIS_STATS_y, HIS_STATS_CLASSES),
+  F_B(HIS_STATS_CLASSES, 0, 1, 0),
+  F_A(HIS_STATS_z, HIS_STATS_MEMORY),
+  F_B(HIS_STATS_MEMORY, 0, 1, 0),
   F_B(HIS_STATS_IAUTH, 0, 1, 0),
   F_B(HIS_WHOIS_SERVERNAME, 0, 1, 0),
   F_B(HIS_WHOIS_IDLETIME, 0, 1, 0),
@@ -477,8 +515,30 @@
   assert(0 != feature);
 
   for (i = 0; features[i].type; i++) /* find appropriate descriptor */
-    if (!strcmp(feature, features[i].type))
+    if (!strcmp(feature, features[i].type)) {
+      if (feat_type(&features[i]) == FEAT_ALIAS) {
+       Debug((DEBUG_NOTICE, "Deprecated feature \"%s\" referenced; replace "
+              "with %s", feature, features[features[i].def_int].type));
+       if (from) /* report a warning */
+         send_reply(from, SND_EXPLICIT | ERR_NOFEATURE,
+                    "%s :Feature deprecated, use %s", feature,
+                    features[features[i].def_int].type);
+       else
+         log_write(LS_CONFIG, L_WARNING, 0, "Feature \"%s\" deprecated, "
+                   "use \"%s\"", feature, features[features[i].def_int].type);
+
+       return &features[features[i].def_int];
+      } else if (feat_type(&features[i]) == FEAT_DEP) {
+       Debug((DEBUG_NOTICE, "Deprecated feature \"%s\" referenced", feature));
+       if (from) /* report a warning */
+         send_reply(from, SND_EXPLICIT | ERR_NOFEATURE,
+                    "%s :Feature deprecated", feature);
+       else
+         log_write(LS_CONFIG, L_WARNING, 0, "Feature \"%s\" deprecated",
+                   feature);
+      }
       return &features[i];
+    }
 
   Debug((DEBUG_ERROR, "Unknown feature \"%s\"", feature));
   if (from) /* report an error */
@@ -514,7 +574,7 @@
     if (from && feat->flags & FEAT_READ)
       return send_reply(from, ERR_NOFEATURE, fields[0]);
 
-    switch (feat->flags & FEAT_MASK) {
+    switch (feat_type(feat)) {
     case FEAT_NONE:
       if (feat->set && (i = (*feat->set)(from, fields + 1, count - 1))) {
        change++; /* feature handler wants a change recorded */
@@ -665,7 +725,7 @@
     if (from && feat->flags & FEAT_READ)
       return send_reply(from, ERR_NOFEATURE, fields[0]);
 
-    switch (feat->flags & FEAT_MASK) {
+    switch (feat_type(feat)) {
     case FEAT_NONE: /* None... */
       if (feat->reset && (i = (*feat->reset)(from, fields + 1, count - 1))) {
        change++; /* feature handler wants a change recorded */
@@ -726,7 +786,7 @@
        (feat->flags & FEAT_OPER && !IsAnOper(from))) /* check privs */
       return send_reply(from, ERR_NOPRIVILEGES);
 
-    switch (feat->flags & FEAT_MASK) {
+    switch (feat_type(feat)) {
     case FEAT_NONE: /* none, call the callback... */
       if (feat->get) /* if there's a callback, use it */
        (*feat->get)(from, fields + 1, count - 1);
@@ -779,7 +839,7 @@
   for (i = 0; features[i].type; i++) {
     change = 0;
 
-    switch (features[i].flags & FEAT_MASK) {
+    switch (feat_type(&features[i])) {
     case FEAT_NONE:
       if (features[i].mark &&
          (*features[i].mark)(features[i].flags & FEAT_MARK ? 1 : 0))
@@ -819,7 +879,7 @@
   int i;
 
   for (i = 0; features[i].type; i++) {
-    switch (features[i].flags & FEAT_MASK) {
+    switch (feat_type(&features[i])) {
     case FEAT_NONE: /* you're on your own */
       break;
 
@@ -857,7 +917,7 @@
        (features[i].flags & FEAT_OPER && !IsAnOper(to)))
       continue; /* skip this one */
 
-    switch (features[i].flags & FEAT_MASK) {
+    switch (feat_type(&features[i])) {
     case FEAT_NONE:
       if (features[i].report) /* let the callback handle this */
        (*features[i].report)(to, features[i].flags & FEAT_MARK ? 1 : 0);
@@ -898,7 +958,7 @@
 feature_int(enum Feature feat)
 {
   assert(features[feat].feat == feat);
-  assert((features[feat].flags & FEAT_MASK) == FEAT_INT);
+  assert(feat_type(&features[feat]) == FEAT_INT);
 
   return features[feat].v_int;
 }
@@ -914,7 +974,7 @@
   if (FEAT_LAST_F < feat)
     return 0;
   assert(features[feat].feat == feat);
-  assert((features[feat].flags & FEAT_MASK) == FEAT_BOOL);
+  assert(feat_type(&features[feat]) == FEAT_BOOL);
 
   return features[feat].v_int;
 }
@@ -927,7 +987,7 @@
 feature_str(enum Feature feat)
 {
   assert(features[feat].feat == feat);
-  assert((features[feat].flags & FEAT_MASK) == FEAT_STR);
+  assert(feat_type(&features[feat]) == FEAT_STR);
 
   return features[feat].v_str;
 }
Index: ircu2.10/ircd/s_stats.c
diff -u ircu2.10/ircd/s_stats.c:1.49 ircu2.10/ircd/s_stats.c:1.50
--- ircu2.10/ircd/s_stats.c:1.49        Thu Apr  6 20:27:50 2006
+++ ircu2.10/ircd/s_stats.c     Thu Jun  1 08:59:19 2006
@@ -63,7 +63,7 @@
 /** @file
  * @brief Report configuration lines and other statistics from this
  * server.
- * @version $Id: s_stats.c,v 1.49 2006/04/07 03:27:50 entrope Exp $
+ * @version $Id: s_stats.c,v 1.50 2006/06/01 15:59:19 klmitch Exp $
  *
  * Note: The info is reported in the order the server uses
  *       it--not reversed as in ircd.conf!
@@ -103,95 +103,95 @@
 
 /** Contains information about all statistics. */
 static struct StatDesc statsinfo[] = {
-  { 'a', "nameservers", STAT_FLAG_OPERFEAT|STAT_FLAG_LOCONLY, FEAT_HIS_STATS_a,
+  { 'a', "nameservers", STAT_FLAG_OPERFEAT|STAT_FLAG_LOCONLY, 
FEAT_HIS_STATS_NAMESERVERS,
     report_dns_servers, 0,
     "DNS servers." },
-  { 'c', "connect", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_c,
+  { 'c', "connect", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_CONNECT,
     stats_configured_links, CONF_SERVER,
     "Remote server connection lines." },
-  { 'd', "maskrules", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), 
FEAT_HIS_STATS_d,
+  { 'd', "maskrules", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), 
FEAT_HIS_STATS_CRULES,
     stats_crule_list, CRULE_MASK,
     "Dynamic routing configuration." },
-  { 'D', "crules", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), FEAT_HIS_STATS_d,
+  { 'D', "crules", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), 
FEAT_HIS_STATS_CRULES,
     stats_crule_list, CRULE_ALL,
     "Dynamic routing configuration." },
-  { 'e', "engine", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_e,
+  { 'e', "engine", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_ENGINE,
     stats_engine, 0,
     "Report server event loop engine." },
-  { 'f', "features", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_f,
+  { 'f', "features", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_FEATURES,
     feature_report, 0,
     "Feature settings." },
-  { 'g', "glines", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_g,
+  { 'g', "glines", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_GLINES,
     gline_stats, 0,
     "Global bans (G-lines)." },
-  { 'i', "access", (STAT_FLAG_OPERFEAT | STAT_FLAG_VARPARAM), FEAT_HIS_STATS_i,
+  { 'i', "access", (STAT_FLAG_OPERFEAT | STAT_FLAG_VARPARAM), 
FEAT_HIS_STATS_ACCESS,
     stats_access, CONF_CLIENT,
     "Connection authorization lines." },
-  { 'j', "histogram", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), 
FEAT_HIS_STATS_j,
+  { 'j', "histogram", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), 
FEAT_HIS_STATS_HISTOGRAM,
     msgq_histogram, 0,
     "Message length histogram." },
-  { 'J', "jupes", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), FEAT_HIS_STATS_J,
+  { 'J', "jupes", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), 
FEAT_HIS_STATS_JUPES,
     stats_nickjupes, 0,
     "Nickname jupes." },
-  { 'k', "klines", (STAT_FLAG_OPERFEAT | STAT_FLAG_VARPARAM), FEAT_HIS_STATS_k,
+  { 'k', "klines", (STAT_FLAG_OPERFEAT | STAT_FLAG_VARPARAM), 
FEAT_HIS_STATS_KLINES,
     stats_klines, 0,
     "Local bans (K-Lines)." },
   { 'l', "links", (STAT_FLAG_OPERFEAT | STAT_FLAG_VARPARAM | 
STAT_FLAG_CASESENS),
-    FEAT_HIS_STATS_l,
+    FEAT_HIS_STATS_LINKS,
     stats_links, 0,
     "Current connections information." },
   { 'L', "modules", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS),
-    FEAT_HIS_STATS_L,
+    FEAT_HIS_STATS_MODULES,
     stats_modules, 0,
     "Dynamically loaded modules." },
-  { 'm', "commands", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), 
FEAT_HIS_STATS_m,
+  { 'm', "commands", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), 
FEAT_HIS_STATS_COMMANDS,
     stats_commands, 0,
     "Message usage information." },
-  { 'o', "operators", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_o,
+  { 'o', "operators", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_OPERATORS,
     stats_configured_links, CONF_OPERATOR,
     "Operator information." },
-  { 'p', "ports", (STAT_FLAG_OPERFEAT | STAT_FLAG_VARPARAM), FEAT_HIS_STATS_p,
+  { 'p', "ports", (STAT_FLAG_OPERFEAT | STAT_FLAG_VARPARAM), 
FEAT_HIS_STATS_PORTS,
     show_ports, 0,
     "Listening ports." },
-  { 'q', "quarantines", (STAT_FLAG_OPERONLY | STAT_FLAG_VARPARAM), 
FEAT_HIS_STATS_q,
+  { 'q', "quarantines", (STAT_FLAG_OPERONLY | STAT_FLAG_VARPARAM), 
FEAT_HIS_STATS_QUARANTINES,
     stats_quarantine, 0,
     "Quarantined channels list." },
-  { 'R', "mappings", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), 
FEAT_HIS_STATS_R,
+  { 'R', "mappings", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), 
FEAT_HIS_STATS_MAPPINGS,
     stats_mapping, 0,
     "Service mappings." },
 #ifdef DEBUGMODE
-  { 'r', "usage", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), FEAT_HIS_STATS_r,
+  { 'r', "usage", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), 
FEAT_HIS_STATS_USAGE,
     send_usage, 0,
     "System resource usage (Debug only)." },
 #endif
-  { 'T', "motds", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), FEAT_HIS_STATS_T,
+  { 'T', "motds", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), 
FEAT_HIS_STATS_MOTDS,
     motd_report, 0,
     "Configured Message Of The Day files." },
-  { 't', "locals", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), FEAT_HIS_STATS_t,
+  { 't', "locals", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), 
FEAT_HIS_STATS_LOCALS,
     tstats, 0,
     "Local connection statistics (Total SND/RCV, etc)." },
-  { 'U', "uworld", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), FEAT_HIS_STATS_U,
+  { 'U', "uworld", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), 
FEAT_HIS_STATS_UWORLD,
     stats_configured_links, CONF_UWORLD,
     "Service server information." },
-  { 'u', "uptime", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), FEAT_HIS_STATS_u,
+  { 'u', "uptime", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), 
FEAT_HIS_STATS_UPTIME,
     stats_uptime, 0,
     "Current uptime & highest connection count." },
-  { 'v', "vservers", (STAT_FLAG_OPERFEAT | STAT_FLAG_VARPARAM | 
STAT_FLAG_CASESENS), FEAT_HIS_STATS_v,
+  { 'v', "vservers", (STAT_FLAG_OPERFEAT | STAT_FLAG_VARPARAM | 
STAT_FLAG_CASESENS), FEAT_HIS_STATS_VSERVERS,
     stats_servers_verbose, 1,
     "Verbose server information." },
-  { 'V', "vserversmach", (STAT_FLAG_OPERFEAT | STAT_FLAG_VARPARAM | 
STAT_FLAG_CASESENS), FEAT_HIS_STATS_v,
+  { 'V', "vserversmach", (STAT_FLAG_OPERFEAT | STAT_FLAG_VARPARAM | 
STAT_FLAG_CASESENS), FEAT_HIS_STATS_VSERVERS,
     stats_servers_verbose, 0,
     "Verbose server information." },
-  { 'w', "userload", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_w,
+  { 'w', "userload", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_USERLOAD,
     calc_load, 0,
     "Userload statistics." },
-  { 'x', "memusage", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_x,
+  { 'x', "memusage", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_MEMUSAGE,
     stats_meminfo, 0,
     "List usage information." },
-  { 'y', "classes", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_y,
+  { 'y', "classes", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_CLASSES,
     report_classes, 0,
     "Connection classes." },
-  { 'z', "memory", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_z,
+  { 'z', "memory", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_MEMORY,
     count_memory, 0,
     "Memory/Structure allocation information." },
   { '*', "help", STAT_FLAG_CASESENS, FEAT_LAST_F,
----------------------- End of diff -----------------------
_______________________________________________
Patches mailing list
Patches@undernet.org
http://undernet.sbg.org/mailman/listinfo/patches

Reply via email to