Revision: 1889
          
http://undernet-ircu.svn.sourceforge.net/undernet-ircu/?rev=1889&view=rev
Author:   klmitch
Date:     2008-10-10 23:52:58 +0000 (Fri, 10 Oct 2008)

Log Message:
-----------
Author: Kev <[EMAIL PROTECTED]>
Description:

Split MODE_DESC_INIT() up into a number of special-purpose macros to
simplify the task; add support for filtering modes based on feature
settings; add targets back to deltas, since we need to be able to support
auto-flushing.

Modified Paths:
--------------
    ircu2/branches/mode/ChangeLog
    ircu2/branches/mode/include/mode.h
    ircu2/branches/mode/ircd/mode-compat.c
    ircu2/branches/mode/ircd/mode.c

Modified: ircu2/branches/mode/ChangeLog
===================================================================
--- ircu2/branches/mode/ChangeLog       2008-10-10 22:34:07 UTC (rev 1888)
+++ ircu2/branches/mode/ChangeLog       2008-10-10 23:52:58 UTC (rev 1889)
@@ -1,5 +1,18 @@
 2008-10-10  Kevin L. Mitchell  <[EMAIL PROTECTED]>
 
+       * include/mode.h: add support for filtering modes based on feature
+       settings; create a new set of macros for initializing a
+       mode_desc_t to simplify the task; add targets back to deltas--we
+       have to support auto-flushing!
+
+       * ircd/mode-compat.c: utilize new MODE_DESC_*() macros; add
+       feature filtering to +A and +U channel modes
+
+       * ircd/mode.c: add support for filtering modes based on feature
+       settings
+
+2008-10-10  Kevin L. Mitchell  <[EMAIL PROTECTED]>
+
        * include/msg.h: add temporary command MTEST to help test and
        debug the new mode infrastructure
 

Modified: ircu2/branches/mode/include/mode.h
===================================================================
--- ircu2/branches/mode/include/mode.h  2008-10-10 22:34:07 UTC (rev 1888)
+++ ircu2/branches/mode/include/mode.h  2008-10-10 23:52:58 UTC (rev 1889)
@@ -28,11 +28,15 @@
 #ifndef INCLUDED_flagset_h
 #include "flagset.h"
 #endif
+#ifndef INCLUDED_features_h
+#include "ircd_features.h"
+#endif
 #ifndef INCLUDED_keyspace_h
 #include "keyspace.h"
 #endif
 
 struct Client;
+struct Channel;
 
 /** Specifies the maximum number of modes permitted on any entity. */
 #define MAX_MODES              64
@@ -56,6 +60,14 @@
 /** Describes the difference between two sets of modes. */
 typedef struct ModeDelta mode_delta_t;
 
+/** Indicate type of target. */
+typedef enum ModeTargetType {
+  MTT_NONE,            /**< No specific target. */
+  MTT_USER,            /**< Target is a user. */
+  MTT_CHANNEL,         /**< Target is a channel. */
+  MTT_SERVER           /**< Target is a server. */
+} mode_targ_t;
+
 /** Describes a single mode. */
 struct ModeDesc {
   regent_t             md_regent;      /**< Registration entry. */
@@ -64,6 +76,7 @@
   mode_t               md_mode;        /**< Numerical value of mode. */
   const char*          md_desc;        /**< Textual description of mode. */
   flagpage_t           md_flags;       /**< Flags affecting mode. */
+  enum Feature         md_feat;        /**< Features controlling mode. */
 };
 
 /** Magic number for a mode descriptor. */
@@ -74,13 +87,49 @@
  * @param[in] sw "Switch" character for the mode.
  * @param[in] desc Description of the mode.
  * @param[in] flags Flags affecting the mode.
+ */
+#define MODE_DESC(name, sw, desc, flags)                               \
+  { REGENT_INIT(MODE_DESC_MAGIC, (name)), (sw), 0, 0, (desc), (flags), \
+    FEAT_LAST_F }
+
+/** Initialize a mode_desc_t.
+ * @param[in] name Descriptive name for the mode.
+ * @param[in] sw "Switch" character for the mode.
+ * @param[in] desc Description of the mode.
+ * @param[in] flags Flags affecting the mode.
  * @param[in] pfx Prefix character used in /NAMES reply.
  * @param[in] prio Priority for ordering prefix characters; unused otherwise.
  */
-#define MODE_DESC_INIT(name, sw, desc, flags, pfx, prio)               \
+#define MODE_DESC_PFX(name, sw, desc, flags, pfx, prio)                        
\
   { REGENT_INIT(MODE_DESC_MAGIC, (name)), (sw), (pfx), 0, (desc),      \
-    (flags) | (((prio) & 0x0f) << 16) }
+    (flags) | (((prio) & 0x0f) << 16), FEAT_LAST_F }
 
+/** Initialize a mode_desc_t.
+ * @param[in] name Descriptive name for the mode.
+ * @param[in] sw "Switch" character for the mode.
+ * @param[in] desc Description of the mode.
+ * @param[in] flags Flags affecting the mode.
+ * @param[in] pfx Prefix character used in /NAMES reply.
+ * @param[in] prio Priority for ordering prefix characters; unused otherwise.
+ * @param[in] feat Feature controlling availability of mode.
+ */
+#define MODE_DESC_FEAT(name, sw, desc, flags, feat)            \
+  { REGENT_INIT(MODE_DESC_MAGIC, (name)), (sw), 0, 0, (desc),  \
+    (flags) | MDFLAG_FEATURE, (feat) }
+
+/** Initialize a mode_desc_t.
+ * @param[in] name Descriptive name for the mode.
+ * @param[in] sw "Switch" character for the mode.
+ * @param[in] desc Description of the mode.
+ * @param[in] flags Flags affecting the mode.
+ * @param[in] pfx Prefix character used in /NAMES reply.
+ * @param[in] prio Priority for ordering prefix characters; unused otherwise.
+ * @param[in] feat Feature controlling availability of mode.
+ */
+#define MODE_DESC_FEAT_PFX(name, sw, desc, flags, pfx, prio, feat)     \
+  { REGENT_INIT(MODE_DESC_MAGIC, (name)), (sw), (pfx), 0, (desc),      \
+    (flags) | (((prio) & 0x0f) << 16) | MDFLAG_FEATURE, (feat) }
+
 /** Check the mode descriptor for validity. */
 #define MODE_DESC_CHECK(md)    REGENT_CHECK((md), MODE_DESC_MAGIC)
 
@@ -94,6 +143,8 @@
 #define MDFLAG_ONESHOT         0x10000000
 /** Mode defaults to extended syntax. */
 #define MDFLAG_ARGEXTENDED     0x08000000
+/** Mode is controlled by a feature. */
+#define MDFLAG_FEATURE         0x04000000
 
 /** Mask for prefix ordering priority. */
 #define MDFLAG_PRIO            0x000f0000
@@ -209,6 +260,12 @@
   struct Client*       md_origin;      /**< Origin of delta. */
   mode_list_t*         md_modes;       /**< Mode list used by this delta. */
 
+  mode_targ_t          md_targtype;    /**< Target type for delta. */
+  union {
+    struct Client*     md_client;      /**< Client target. */
+    struct Channel*    md_channel;     /**< Channel target. */
+  }                    md_target;      /**< Target of delta. */
+
   mode_set_t           md_add;         /**< Simple modes to be added. */
   mode_set_t           md_rem;         /**< Simple modes to be removed. */
 

Modified: ircu2/branches/mode/ircd/mode-compat.c
===================================================================
--- ircu2/branches/mode/ircd/mode-compat.c      2008-10-10 22:34:07 UTC (rev 
1888)
+++ ircu2/branches/mode/ircd/mode-compat.c      2008-10-10 23:52:58 UTC (rev 
1889)
@@ -22,6 +22,7 @@
  */
 #include "config.h"
 
+#include "ircd_features.h"
 #include "mode-compat.h"
 #include "mode.h"
 #include "register.h"
@@ -33,87 +34,87 @@
  * order as enum ChanModes!
  */
 mode_desc_t _cmodes[] = {
-  MODE_DESC_INIT("CHANOP",     'o', "Channel operator.",
-                MDPAR_ARG_CLI | MDPAR_TYPE_REQARG | MDPOL_AUTHZ_CHOP |
-                MDFLAG_LIST, '@', 15),
-  MODE_DESC_INIT("VOICE",      'v', "Has voice.",
-                MDPAR_ARG_CLI | MDPAR_TYPE_REQARG | MDPOL_AUTHZ_CHOP |
-                MDFLAG_LIST, '+', 0),
-  MODE_DESC_INIT("PRIVATE",    'p', "Channel is private.",
-                MDPOL_AUTHZ_CHOP, 0, 0),
-  MODE_DESC_INIT("SECRET",     's', "Channel is secret.",
-                MDPOL_AUTHZ_CHOP, 0, 0),
-  MODE_DESC_INIT("MODERATED",  'm', "Channel is moderated.",
-                MDPOL_AUTHZ_CHOP, 0, 0),
-  MODE_DESC_INIT("TOPICLIMIT", 't', "Topic control limited.",
-                MDPOL_AUTHZ_CHOP, 0, 0),
-  MODE_DESC_INIT("INVITEONLY", 'i', "Invite-only channel.",
-                MDPOL_AUTHZ_CHOP, 0, 0),
-  MODE_DESC_INIT("NOPRIVMSGS", 'n', "No external private messages.",
-                MDPOL_AUTHZ_CHOP, 0, 0),
-  MODE_DESC_INIT("KEY",                'k', "Channel key.",
+  MODE_DESC_PFX("CHANOP",      'o', "Channel operator.",
+               MDPAR_ARG_CLI | MDPAR_TYPE_REQARG | MDPOL_AUTHZ_CHOP |
+               MDFLAG_LIST, '@', 15),
+  MODE_DESC_PFX("VOICE",       'v', "Has voice.",
+               MDPAR_ARG_CLI | MDPAR_TYPE_REQARG | MDPOL_AUTHZ_CHOP |
+               MDFLAG_LIST, '+', 0),
+  MODE_DESC("PRIVATE",         'p', "Channel is private.",
+           MDPOL_AUTHZ_CHOP),
+  MODE_DESC("SECRET",          's', "Channel is secret.",
+           MDPOL_AUTHZ_CHOP),
+  MODE_DESC("MODERATED",       'm', "Channel is moderated.",
+           MDPOL_AUTHZ_CHOP),
+  MODE_DESC("TOPICLIMIT",      't', "Topic control limited.",
+           MDPOL_AUTHZ_CHOP),
+  MODE_DESC("INVITEONLY",      'i', "Invite-only channel.",
+           MDPOL_AUTHZ_CHOP),
+  MODE_DESC("NOPRIVMSGS",      'n', "No external private messages.",
+           MDPOL_AUTHZ_CHOP),
+  MODE_DESC("KEY",             'k', "Channel key.",
+           MDPAR_ARG_STR | MDPAR_TYPE_REQARG | MDPOL_AUTHZ_CHOP |
+           MDFLAG_VIS_CHOP | MDFLAG_ONESHOT),
+  MODE_DESC("BAN",             'b', "Channel ban.",
+           MDPAR_ARG_STR | MDPAR_TYPE_REQARG | MDPOL_AUTHZ_CHOP |
+           MDFLAG_LIST),
+  MODE_DESC("LIMIT",           'l', "Channel limit.",
+           MDPAR_ARG_INT | MDPAR_TYPE_ADDARG | MDPOL_AUTHZ_CHOP |
+           MDFLAG_ONESHOT),
+  MODE_DESC("REGONLY",         'r', "Only +r users may join.",
+           MDPOL_AUTHZ_CHOP),
+  MODE_DESC("DELJOINS",                'D', "Join messages delayed.",
+           MDPOL_AUTHZ_CHOP),
+  MODE_DESC("REGISTERED",      'R', "Channel is registered.",
+           MDPOL_AUTHZ_SERV),
+  MODE_DESC_FEAT("UPASS",      'U', "Channel user pass.",
                 MDPAR_ARG_STR | MDPAR_TYPE_REQARG | MDPOL_AUTHZ_CHOP |
-                MDFLAG_VIS_CHOP | MDFLAG_ONESHOT, 0, 0),
-  MODE_DESC_INIT("BAN",                'b', "Channel ban.",
+                MDFLAG_VIS_CHOP | MDFLAG_ONESHOT, FEAT_OPLEVELS),
+  MODE_DESC_FEAT("APASS",      'A', "Channel admin pass.",
                 MDPAR_ARG_STR | MDPAR_TYPE_REQARG | MDPOL_AUTHZ_CHOP |
-                MDFLAG_LIST, 0, 0),
-  MODE_DESC_INIT("LIMIT",      'l', "Channel limit.",
-                MDPAR_ARG_INT | MDPAR_TYPE_ADDARG | MDPOL_AUTHZ_CHOP |
-                MDFLAG_ONESHOT, 0, 0),
-  MODE_DESC_INIT("REGONLY",    'r', "Only +r users may join.",
-                MDPOL_AUTHZ_CHOP, 0, 0),
-  MODE_DESC_INIT("DELJOINS",   'D', "Join messages delayed.",
-                MDPOL_AUTHZ_CHOP, 0, 0),
-  MODE_DESC_INIT("REGISTERED", 'R', "Channel is registered.",
-                MDPOL_AUTHZ_SERV, 0, 0),
-  MODE_DESC_INIT("UPASS",      'U', "Channel user pass.",
-                MDPAR_ARG_STR | MDPAR_TYPE_REQARG | MDPOL_AUTHZ_CHOP |
-                MDFLAG_VIS_CHOP | MDFLAG_ONESHOT, 0, 0),
-  MODE_DESC_INIT("APASS",      'A', "Channel admin pass.",
-                MDPAR_ARG_STR | MDPAR_TYPE_REQARG | MDPOL_AUTHZ_CHOP |
-                MDFLAG_VIS_CHOP | MDFLAG_ONESHOT, 0, 0),
-  MODE_DESC_INIT("WASDELJOINS",        'd', "Channel has delayed joins.",
-                MDPOL_AUTHZ_NONE, 0, 0)
+                MDFLAG_VIS_CHOP | MDFLAG_ONESHOT, FEAT_OPLEVELS),
+  MODE_DESC("WASDELJOINS",     'd', "Channel has delayed joins.",
+           MDPOL_AUTHZ_NONE)
 };
 
 /** Initial list of user modes.  Note that this must be the same order
  * as enum UserModes!
  */
 mode_desc_t _umodes[] = {
-  MODE_DESC_INIT("LOCOP",      'O', "Local IRC operator.",
-                MDPOL_AUTHZ_OPER, 0, 0),
-  MODE_DESC_INIT("OPER",       'o', "Global IRC operator.",
-                MDPOL_AUTHZ_GOP, 0, 0),
-  MODE_DESC_INIT("SERVNOTICE", 's', "Receive server notices.",
-                MDPAR_ARG_INT | MDPAR_TYPE_OPTARG | MDFLAG_HEXINT |
-                MDFLAG_LOCAL, 0, 0),
-  MODE_DESC_INIT("INVISIBLE",  'i', "User invisible.",
-                0, 0, 0),
-  MODE_DESC_INIT("WALLOP",     'w', "User receives /WALLOPS.",
-                0, 0, 0),
-  MODE_DESC_INIT("DEAF",       'd', "User is deaf.",
-                0, 0, 0),
-  MODE_DESC_INIT("CHSERV",     'k', "User is a channel service.",
-                MDPOL_AUTHZ_SERV, 0, 0),
-  MODE_DESC_INIT("DEBUG",      'g', "User receives debug messages.",
-                0, 0, 0),
-  MODE_DESC_INIT("ACCOUNT",    'r', "User is logged in.",
-                MDPAR_ARG_STR | MDPAR_TYPE_REQARG | MDPOL_AUTHZ_SERV |
-                MDFLAG_VIS_SERV, 0, 0),
-  MODE_DESC_INIT("HIDDENHOST", 'x', "User's host is hidden.",
-                0, 0, 0)
+  MODE_DESC("LOCOP",           'O', "Local IRC operator.",
+           MDPOL_AUTHZ_OPER),
+  MODE_DESC("OPER",            'o', "Global IRC operator.",
+           MDPOL_AUTHZ_GOP),
+  MODE_DESC("SERVNOTICE",      's', "Receive server notices.",
+           MDPAR_ARG_INT | MDPAR_TYPE_OPTARG | MDFLAG_HEXINT |
+           MDFLAG_LOCAL),
+  MODE_DESC("INVISIBLE",       'i', "User invisible.",
+           0),
+  MODE_DESC("WALLOP",          'w', "User receives /WALLOPS.",
+           0),
+  MODE_DESC("DEAF",            'd', "User is deaf.",
+           0),
+  MODE_DESC("CHSERV",          'k', "User is a channel service.",
+           MDPOL_AUTHZ_SERV),
+  MODE_DESC("DEBUG",           'g', "User receives debug messages.",
+           0),
+  MODE_DESC("ACCOUNT",         'r', "User is logged in.",
+           MDPAR_ARG_STR | MDPAR_TYPE_REQARG | MDPOL_AUTHZ_SERV |
+           MDFLAG_VIS_SERV),
+  MODE_DESC("HIDDENHOST",      'x', "User's host is hidden.",
+           0)
 };
 
 /** Initial list of server modes.  Note that this must be the same
  * order as enum ServModes!
  */
 mode_desc_t _smodes[] = {
-  MODE_DESC_INIT("HUB",                'h', "Server is a hub.",
-                MDPOL_AUTHZ_SERV, 0, 0),
-  MODE_DESC_INIT("SERVICE",    's', "Server is a service.",
-                MDPOL_AUTHZ_SERV, 0, 0),
-  MODE_DESC_INIT("IPV6",       '6', "Server supports IPv6.",
-                MDPOL_AUTHZ_SERV, 0, 0)
+  MODE_DESC("HUB",             'h', "Server is a hub.",
+           MDPOL_AUTHZ_SERV),
+  MODE_DESC("SERVICE",         's', "Server is a service.",
+           MDPOL_AUTHZ_SERV),
+  MODE_DESC("IPV6",            '6', "Server supports IPv6.",
+           MDPOL_AUTHZ_SERV)
 };
 
 /** Mode list for channels. */

Modified: ircu2/branches/mode/ircd/mode.c
===================================================================
--- ircu2/branches/mode/ircd/mode.c     2008-10-10 22:34:07 UTC (rev 1888)
+++ ircu2/branches/mode/ircd/mode.c     2008-10-10 23:52:58 UTC (rev 1889)
@@ -23,6 +23,7 @@
 #include "config.h"
 
 #include "mode.h"
+#include "ircd_features.h"
 #include "ircd_log.h"
 #include "register.h"
 #include "s_debug.h"
@@ -168,7 +169,8 @@
   /* Check if we're including this mode */
   if (!(md->md_flags & MDFLAG_ARGEXTENDED) &&
       (md->md_flags & MDFLAG_VIS_MASK) < MDFLAG_VIS_SERV &&
-      (!is->args || (md->md_flags & MDPAR_TYPE_MASK) > MDPAR_TYPE_OPTARG))
+      (!is->args || (md->md_flags & MDPAR_TYPE_MASK) > MDPAR_TYPE_OPTARG) &&
+      (!(md->md_flags & MDFLAG_FEATURE) || feature_bool(md->md_feat)))
     /* Add this mode to the buffer */
     is->buf[is->len++] = md->md_switch;
 
@@ -237,7 +239,8 @@
   /* Check if we need to omit this mode */
   if ((md->md_flags & MDFLAG_ARGEXTENDED) ||
       (md->md_flags & MDFLAG_VIS_MASK) >= MDFLAG_VIS_SERV ||
-      md->md_prefix)
+      md->md_prefix ||
+      ((md->md_flags & MDFLAG_FEATURE) && !feature_bool(md->md_feat)))
     return 0; /* skip this one */
 
   Debug((DEBUG_DEBUG, "mm_build() processing mode %s (%c)", rl_id(md),
@@ -366,7 +369,8 @@
   assert(MODE_DESC_CHECK(md));
 
   /* Does this mode have an associated prefix? */
-  if (md->md_prefix) {
+  if (md->md_prefix &&
+      (!(md->md_flags & MDFLAG_FEATURE) || feature_bool(md->md_feat))) {
     if (ps->modes[flag2prio(md->md_flags)] || ps->count >= ps->max)
       return -1; /* two modes of the same priority, or buffer too small */
 


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.
_______________________________________________
Patches mailing list
[email protected]
http://undernet.sbg.org/mailman/listinfo/patches

Reply via email to