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