Revision: 1888
http://undernet-ircu.svn.sourceforge.net/undernet-ircu/?rev=1888&view=rev
Author: klmitch
Date: 2008-10-10 22:34:07 +0000 (Fri, 10 Oct 2008)
Log Message:
-----------
Author: Kev <[EMAIL PROTECTED]>
Description:
Create new (temporary) MTEST command for testing the new mode system;
at present, only tests the mode_str_info(), mode_str_modes(), and
mode_str_prefix() functions. Also, apply bug fixes to those three
functions and to _reg_find() where the bubbling procedure could cause
data loss.
Modified Paths:
--------------
ircu2/branches/mode/ChangeLog
ircu2/branches/mode/include/handlers.h
ircu2/branches/mode/include/msg.h
ircu2/branches/mode/ircd/Makefile.am
ircu2/branches/mode/ircd/Makefile.in
ircu2/branches/mode/ircd/mode.c
ircu2/branches/mode/ircd/parse.c
ircu2/branches/mode/ircd/register.c
Added Paths:
-----------
ircu2/branches/mode/ircd/m_mtest.c
Modified: ircu2/branches/mode/ChangeLog
===================================================================
--- ircu2/branches/mode/ChangeLog 2008-10-09 14:34:20 UTC (rev 1887)
+++ ircu2/branches/mode/ChangeLog 2008-10-10 22:34:07 UTC (rev 1888)
@@ -1,3 +1,32 @@
+2008-10-10 Kevin L. Mitchell <[EMAIL PROTECTED]>
+
+ * include/msg.h: add temporary command MTEST to help test and
+ debug the new mode infrastructure
+
+ * include/handlers.h: add temporary command MTEST to help test and
+ debug the new mode infrastructure
+
+ * ircd/Makefile.in: regenerate from Makefile.am
+
+ * ircd/Makefile.am (ircd_SOURCES): add temporary command MTEST to
+ help test and debug the new mode infrastructure
+
+ * ircd/parse.c: add temporary command MTEST to help test and debug
+ the new mode infrastructure
+
+ * ircd/mode.c: mi_build() should include modes *with* arguments
+ when is->args is true; add debugging statements to mm_build();
+ length test fails when length is *greater* than size, not less
+ than; mm_build() must increment buffer length once a mode is
+ added; mode_str_prefix() needs to increment j when building the
+ prefix string
+
+ * ircd/m_mtest.c: temporary command to help test and debug the new
+ mode infrastructure
+
+ * ircd/register.c (_reg_find): when cursor->rl_prev is NULL, we
+ have to update the root of the linked list
+
2008-10-09 Kevin L. Mitchell <[EMAIL PROTECTED]>
* ircd/register.c (reg_add): at this point, entry->rl_desc is
Modified: ircu2/branches/mode/include/handlers.h
===================================================================
--- ircu2/branches/mode/include/handlers.h 2008-10-09 14:34:20 UTC (rev
1887)
+++ ircu2/branches/mode/include/handlers.h 2008-10-10 22:34:07 UTC (rev
1888)
@@ -107,6 +107,7 @@
extern int m_map_redirect(struct Client*, struct Client*, int, char*[]);
extern int m_mode(struct Client*, struct Client*, int, char*[]);
extern int m_motd(struct Client*, struct Client*, int, char*[]);
+extern int m_mtest(struct Client*, struct Client*, int, char*[]);
extern int m_names(struct Client*, struct Client*, int, char*[]);
extern int m_nick(struct Client*, struct Client*, int, char*[]);
extern int m_not_oper(struct Client*, struct Client*, int, char*[]);
Modified: ircu2/branches/mode/include/msg.h
===================================================================
--- ircu2/branches/mode/include/msg.h 2008-10-09 14:34:20 UTC (rev 1887)
+++ ircu2/branches/mode/include/msg.h 2008-10-10 22:34:07 UTC (rev 1888)
@@ -232,6 +232,10 @@
#define TOK_MODE "M"
#define CMD_MODE MSG_MODE, TOK_MODE
+#define MSG_MTEST "MTEST" /* MTES */
+#define TOK_MTEST "MTEST"
+#define CMD_MTEST MSG_MTEST, TOK_MTEST
+
#define MSG_KICK "KICK" /* KICK */
#define TOK_KICK "K"
#define CMD_KICK MSG_KICK, TOK_KICK
Modified: ircu2/branches/mode/ircd/Makefile.am
===================================================================
--- ircu2/branches/mode/ircd/Makefile.am 2008-10-09 14:34:20 UTC (rev
1887)
+++ ircu2/branches/mode/ircd/Makefile.am 2008-10-10 22:34:07 UTC (rev
1888)
@@ -111,6 +111,7 @@
m_map.c \
m_mode.c \
m_motd.c \
+ m_mtest.c \
m_names.c \
m_nick.c \
m_notice.c \
Modified: ircu2/branches/mode/ircd/Makefile.in
===================================================================
--- ircu2/branches/mode/ircd/Makefile.in 2008-10-09 14:34:20 UTC (rev
1887)
+++ ircu2/branches/mode/ircd/Makefile.in 2008-10-10 22:34:07 UTC (rev
1888)
@@ -68,10 +68,10 @@
m_destruct.c m_desynch.c m_die.c m_endburst.c m_error.c \
m_get.c m_gline.c m_help.c m_info.c m_invite.c m_ison.c \
m_join.c m_jupe.c m_kick.c m_kill.c m_links.c m_list.c \
- m_lusers.c m_map.c m_mode.c m_motd.c m_names.c m_nick.c \
- m_notice.c m_oper.c m_opmode.c m_part.c m_pass.c m_ping.c \
- m_pong.c m_privmsg.c m_privs.c m_proto.c m_pseudo.c m_quit.c \
- m_rehash.c m_reset.c m_restart.c m_rping.c m_rpong.c \
+ m_lusers.c m_map.c m_mode.c m_motd.c m_mtest.c m_names.c \
+ m_nick.c m_notice.c m_oper.c m_opmode.c m_part.c m_pass.c \
+ m_ping.c m_pong.c m_privmsg.c m_privs.c m_proto.c m_pseudo.c \
+ m_quit.c m_rehash.c m_reset.c m_restart.c m_rping.c m_rpong.c \
m_server.c m_set.c m_settime.c m_silence.c m_squit.c m_stats.c \
m_time.c m_topic.c m_trace.c m_uping.c m_user.c m_userhost.c \
m_userip.c m_version.c m_wallchops.c m_wallops.c m_wallusers.c \
@@ -110,32 +110,32 @@
m_ison.$(OBJEXT) m_join.$(OBJEXT) m_jupe.$(OBJEXT) \
m_kick.$(OBJEXT) m_kill.$(OBJEXT) m_links.$(OBJEXT) \
m_list.$(OBJEXT) m_lusers.$(OBJEXT) m_map.$(OBJEXT) \
- m_mode.$(OBJEXT) m_motd.$(OBJEXT) m_names.$(OBJEXT) \
- m_nick.$(OBJEXT) m_notice.$(OBJEXT) m_oper.$(OBJEXT) \
- m_opmode.$(OBJEXT) m_part.$(OBJEXT) m_pass.$(OBJEXT) \
- m_ping.$(OBJEXT) m_pong.$(OBJEXT) m_privmsg.$(OBJEXT) \
- m_privs.$(OBJEXT) m_proto.$(OBJEXT) m_pseudo.$(OBJEXT) \
- m_quit.$(OBJEXT) m_rehash.$(OBJEXT) m_reset.$(OBJEXT) \
- m_restart.$(OBJEXT) m_rping.$(OBJEXT) m_rpong.$(OBJEXT) \
- m_server.$(OBJEXT) m_set.$(OBJEXT) m_settime.$(OBJEXT) \
- m_silence.$(OBJEXT) m_squit.$(OBJEXT) m_stats.$(OBJEXT) \
- m_time.$(OBJEXT) m_topic.$(OBJEXT) m_trace.$(OBJEXT) \
- m_uping.$(OBJEXT) m_user.$(OBJEXT) m_userhost.$(OBJEXT) \
- m_userip.$(OBJEXT) m_version.$(OBJEXT) m_wallchops.$(OBJEXT) \
- m_wallops.$(OBJEXT) m_wallusers.$(OBJEXT) \
- m_wallvoices.$(OBJEXT) m_who.$(OBJEXT) m_whois.$(OBJEXT) \
- m_whowas.$(OBJEXT) match.$(OBJEXT) memdebug.$(OBJEXT) \
- mode.$(OBJEXT) mode-compat.$(OBJEXT) motd.$(OBJEXT) \
- msgq.$(OBJEXT) numnicks.$(OBJEXT) opercmds.$(OBJEXT) \
- os_generic.$(OBJEXT) packet.$(OBJEXT) parse.$(OBJEXT) \
- querycmds.$(OBJEXT) random.$(OBJEXT) register.$(OBJEXT) \
- s_auth.$(OBJEXT) s_bsd.$(OBJEXT) s_conf.$(OBJEXT) \
- s_debug.$(OBJEXT) s_err.$(OBJEXT) s_misc.$(OBJEXT) \
- s_numeric.$(OBJEXT) s_serv.$(OBJEXT) s_stats.$(OBJEXT) \
- s_user.$(OBJEXT) send.$(OBJEXT) uping.$(OBJEXT) \
- userload.$(OBJEXT) whowas.$(OBJEXT) $(am__objects_1) \
- $(am__objects_2) $(am__objects_3) $(am__objects_4) \
- $(am__objects_5)
+ m_mode.$(OBJEXT) m_motd.$(OBJEXT) m_mtest.$(OBJEXT) \
+ m_names.$(OBJEXT) m_nick.$(OBJEXT) m_notice.$(OBJEXT) \
+ m_oper.$(OBJEXT) m_opmode.$(OBJEXT) m_part.$(OBJEXT) \
+ m_pass.$(OBJEXT) m_ping.$(OBJEXT) m_pong.$(OBJEXT) \
+ m_privmsg.$(OBJEXT) m_privs.$(OBJEXT) m_proto.$(OBJEXT) \
+ m_pseudo.$(OBJEXT) m_quit.$(OBJEXT) m_rehash.$(OBJEXT) \
+ m_reset.$(OBJEXT) m_restart.$(OBJEXT) m_rping.$(OBJEXT) \
+ m_rpong.$(OBJEXT) m_server.$(OBJEXT) m_set.$(OBJEXT) \
+ m_settime.$(OBJEXT) m_silence.$(OBJEXT) m_squit.$(OBJEXT) \
+ m_stats.$(OBJEXT) m_time.$(OBJEXT) m_topic.$(OBJEXT) \
+ m_trace.$(OBJEXT) m_uping.$(OBJEXT) m_user.$(OBJEXT) \
+ m_userhost.$(OBJEXT) m_userip.$(OBJEXT) m_version.$(OBJEXT) \
+ m_wallchops.$(OBJEXT) m_wallops.$(OBJEXT) \
+ m_wallusers.$(OBJEXT) m_wallvoices.$(OBJEXT) m_who.$(OBJEXT) \
+ m_whois.$(OBJEXT) m_whowas.$(OBJEXT) match.$(OBJEXT) \
+ memdebug.$(OBJEXT) mode.$(OBJEXT) mode-compat.$(OBJEXT) \
+ motd.$(OBJEXT) msgq.$(OBJEXT) numnicks.$(OBJEXT) \
+ opercmds.$(OBJEXT) os_generic.$(OBJEXT) packet.$(OBJEXT) \
+ parse.$(OBJEXT) querycmds.$(OBJEXT) random.$(OBJEXT) \
+ register.$(OBJEXT) s_auth.$(OBJEXT) s_bsd.$(OBJEXT) \
+ s_conf.$(OBJEXT) s_debug.$(OBJEXT) s_err.$(OBJEXT) \
+ s_misc.$(OBJEXT) s_numeric.$(OBJEXT) s_serv.$(OBJEXT) \
+ s_stats.$(OBJEXT) s_user.$(OBJEXT) send.$(OBJEXT) \
+ uping.$(OBJEXT) userload.$(OBJEXT) whowas.$(OBJEXT) \
+ $(am__objects_1) $(am__objects_2) $(am__objects_3) \
+ $(am__objects_4) $(am__objects_5)
nodist_ircd_OBJECTS = version.$(OBJEXT)
ircd_OBJECTS = $(am_ircd_OBJECTS) $(nodist_ircd_OBJECTS)
am__DEPENDENCIES_1 =
@@ -305,10 +305,10 @@
m_destruct.c m_desynch.c m_die.c m_endburst.c m_error.c \
m_get.c m_gline.c m_help.c m_info.c m_invite.c m_ison.c \
m_join.c m_jupe.c m_kick.c m_kill.c m_links.c m_list.c \
- m_lusers.c m_map.c m_mode.c m_motd.c m_names.c m_nick.c \
- m_notice.c m_oper.c m_opmode.c m_part.c m_pass.c m_ping.c \
- m_pong.c m_privmsg.c m_privs.c m_proto.c m_pseudo.c m_quit.c \
- m_rehash.c m_reset.c m_restart.c m_rping.c m_rpong.c \
+ m_lusers.c m_map.c m_mode.c m_motd.c m_mtest.c m_names.c \
+ m_nick.c m_notice.c m_oper.c m_opmode.c m_part.c m_pass.c \
+ m_ping.c m_pong.c m_privmsg.c m_privs.c m_proto.c m_pseudo.c \
+ m_quit.c m_rehash.c m_reset.c m_restart.c m_rping.c m_rpong.c \
m_server.c m_set.c m_settime.c m_silence.c m_squit.c m_stats.c \
m_time.c m_topic.c m_trace.c m_uping.c m_user.c m_userhost.c \
m_userip.c m_version.c m_wallchops.c m_wallops.c m_wallusers.c \
@@ -476,6 +476,7 @@
@AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
@AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
@AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
[EMAIL PROTECTED]@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
@AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
@AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
@AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
Added: ircu2/branches/mode/ircd/m_mtest.c
===================================================================
--- ircu2/branches/mode/ircd/m_mtest.c (rev 0)
+++ ircu2/branches/mode/ircd/m_mtest.c 2008-10-10 22:34:07 UTC (rev 1888)
@@ -0,0 +1,137 @@
+/*
+ * IRC - Internet Relay Chat, ircd/m_mtest.c
+ * Copyright (C) 2008 Kevin L. Mitchell
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include "config.h"
+
+#include "handlers.h"
+#include "ircd.h"
+#include "ircd_reply.h"
+#include "ircd_string.h"
+#include "mode.h"
+#include "mode-compat.h"
+#include "msg.h"
+#include "register.h"
+#include "send.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+typedef int (*bqcmp)(const void*, const void*);
+typedef int (*mt_subcmd_t)(struct Client* sptr, mode_list_t* ml,
+ int parc, char* parv[]);
+
+static int
+mt_info(struct Client* sptr, mode_list_t* ml, int parc, char* parv[])
+{
+ char buf[512];
+ int len = sizeof(buf);
+
+ if (!ml)
+ ml = &chanmodes;
+
+ sendcmdto_one(&me, CMD_NOTICE, sptr, "%C :mode_str_info() returned %s",
+ sptr, mode_str_info(ml, buf, &len, parc));
+
+ return 0;
+}
+
+static int
+mt_modes(struct Client* sptr, mode_list_t* ml, int parc, char* parv[])
+{
+ char buf[512];
+ int len = sizeof(buf);
+
+ if (!ml)
+ ml = &chanmodes;
+
+ sendcmdto_one(&me, CMD_NOTICE, sptr, "%C :mode_str_modes() returned %s",
+ sptr, mode_str_modes(ml, buf, &len));
+ sendcmdto_one(&me, CMD_NOTICE, sptr, "%C :buffer contains %s", sptr, buf);
+
+ return 0;
+}
+
+static int
+mt_prefix(struct Client* sptr, mode_list_t* ml, int parc, char* parv[])
+{
+ char buf[512];
+ int len = sizeof(buf);
+
+ if (!ml)
+ ml = &chanmodes;
+
+ sendcmdto_one(&me, CMD_NOTICE, sptr, "%C :mode_str_prefix() returned %s",
+ sptr, mode_str_prefix(ml, buf, &len));
+
+ return 0;
+}
+
+/* Command descriptor structure. */
+static struct mt_subcmd {
+ const char* cmd;
+ mt_subcmd_t proc;
+} cmdlist[] = {
+#define SC(cmd) { #cmd, mt_ ## cmd }
+ SC(info), SC(modes), SC(prefix)
+#undef SC
+};
+
+#define cmdlist_cnt (sizeof(cmdlist) / sizeof(struct mt_subcmd))
+
+static int
+subcmd_search(const char* cmd, const struct mt_subcmd *elem)
+{
+ return ircd_strcmp(cmd, elem->cmd);
+}
+
+int
+m_mtest(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
+{
+ char *subcmd, *modelist;
+ struct mt_subcmd *cmd;
+ mode_list_t *ml = 0;
+
+ if (parc < 2)
+ return need_more_params(sptr, "MTEST");
+
+ subcmd = parv[1];
+ parc -= 2;
+ parv += 2;
+
+ if (!(cmd = (struct mt_subcmd*) bsearch(subcmd, cmdlist, cmdlist_cnt,
+ sizeof(struct mt_subcmd),
+ (bqcmp) subcmd_search))) {
+ sendcmdto_one(&me, CMD_NOTICE, sptr, "%C :Unknown subcommand %s",
+ sptr, subcmd);
+ return 0;
+ }
+
+ if (parc > 0 && *parv[0] == '%') {
+ modelist = parv[0] + 1;
+ parc--;
+ parv++;
+
+ if (!(ml = reg_find(MODE_TABLE, modelist))) {
+ sendcmdto_one(&me, CMD_NOTICE, sptr, "%C :Unknown mode list %s",
+ sptr, modelist);
+ return 0;
+ }
+ }
+
+ return (cmd->proc)(sptr, ml, parc, parv);
+}
Property changes on: ircu2/branches/mode/ircd/m_mtest.c
___________________________________________________________________
Added: svn:keywords
+ Id
Modified: ircu2/branches/mode/ircd/mode.c
===================================================================
--- ircu2/branches/mode/ircd/mode.c 2008-10-09 14:34:20 UTC (rev 1887)
+++ ircu2/branches/mode/ircd/mode.c 2008-10-10 22:34:07 UTC (rev 1888)
@@ -25,6 +25,7 @@
#include "mode.h"
#include "ircd_log.h"
#include "register.h"
+#include "s_debug.h"
#include <string.h>
@@ -167,7 +168,7 @@
/* 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))
/* Add this mode to the buffer */
is->buf[is->len++] = md->md_switch;
@@ -239,8 +240,11 @@
md->md_prefix)
return 0; /* skip this one */
+ Debug((DEBUG_DEBUG, "mm_build() processing mode %s (%c)", rl_id(md),
+ md->md_switch));
+
/* Check the length... */
- if (ms->len + 1 <= ms->size)
+ if (ms->len + 1 >= ms->size)
return -1;
/* Figure out which type of mode this is. */
@@ -266,6 +270,18 @@
break;
}
+ Debug((DEBUG_DEBUG, "Mode is type %d (%c)", type,
+ type == TYPE_A ? 'A' :
+ (type == TYPE_B ? 'B' :
+ (type == TYPE_C ? 'C' :
+ (type == TYPE_D ? 'D' : '?')))));
+ Debug((DEBUG_DEBUG, "Buffer offsets: (%d, %d, %d, %d); contents \"%s\" (%p)",
+ ms->types[TYPE_A] - ms->buf, ms->types[TYPE_B] - ms->buf,
+ ms->types[TYPE_C] - ms->buf, ms->types[TYPE_D] - ms->buf,
+ ms->buf, ms->buf));
+ Debug((DEBUG_DEBUG, "memmove(%p, %p, %d)", ms->types[type] + 1,
+ ms->types[type], ms->len + 1 - (ms->types[type] - ms->buf)));
+
/* OK, let's shift the string over one position */
memmove(ms->types[type] + 1, ms->types[type],
ms->len + 1 - (ms->types[type] - ms->buf));
@@ -277,6 +293,15 @@
for (; type <= TYPE_D; type++)
ms->types[type]++;
+ /* increment the length */
+ ms->len++;
+
+ Debug((DEBUG_DEBUG, "Buffer offsets now: (%d, %d, %d, %d); "
+ "contents \"%s\" (%p)",
+ ms->types[TYPE_A] - ms->buf, ms->types[TYPE_B] - ms->buf,
+ ms->types[TYPE_C] - ms->buf, ms->types[TYPE_D] - ms->buf,
+ ms->buf, ms->buf));
+
return 0;
}
@@ -387,6 +412,7 @@
if (ps.modes[i]) {
buf[j + 1] = ps.modes[i]->md_switch;
buf[j + offset] = ps.modes[i]->md_prefix;
+ j++;
}
return buf; /* and return the assembled buffer */
Modified: ircu2/branches/mode/ircd/parse.c
===================================================================
--- ircu2/branches/mode/ircd/parse.c 2008-10-09 14:34:20 UTC (rev 1887)
+++ ircu2/branches/mode/ircd/parse.c 2008-10-10 22:34:07 UTC (rev 1888)
@@ -476,6 +476,13 @@
{ m_unregistered, m_motd, m_motd, m_motd, m_ignore }
},
{
+ MSG_MTEST,
+ TOK_MTEST,
+ 0, MAXPARA, MFLG_SLOW, 0, NULL,
+ /* UNREG, CLIENT, SERVER, OPER, SERVICE */
+ { m_unregistered, m_mtest, m_mtest, m_mtest, m_ignore }
+ },
+ {
MSG_CLOSE,
TOK_CLOSE,
0, MAXPARA, MFLG_SLOW, 0, NULL,
Modified: ircu2/branches/mode/ircd/register.c
===================================================================
--- ircu2/branches/mode/ircd/register.c 2008-10-09 14:34:20 UTC (rev 1887)
+++ ircu2/branches/mode/ircd/register.c 2008-10-10 22:34:07 UTC (rev 1888)
@@ -198,6 +198,8 @@
/* update surrounding entries in the list */
if (cursor->rl_prev)
cursor->rl_prev->rl_next = cursor;
+ else
+ table->reg_list = cursor;
if (tmp->rl_next)
tmp->rl_next->rl_prev = tmp;
}
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