extern void delete_isupport(const char *);
extern void show_isupport(struct Client *);
extern void init_isupport(void);
+extern void chantypes_update(void);
extern const char *isupport_intptr(const void *);
extern const char *isupport_boolean(const void *);
#include "chmode.h"
#include "send.h"
+static char allowed_chantypes[BUFSIZE];
rb_dlink_list isupportlist;
struct isupportitem
return result;
}
-static const char *
-isupport_chantypes(const void *ptr)
-{
- return ConfigChannel.disable_local_channels ? "#" : "&#";
-}
-
static const char *
isupport_chanlimit(const void *ptr)
{
static char result[30];
- snprintf(result, sizeof result, "%s:%i",
- ConfigChannel.disable_local_channels ? "#" : "&#", ConfigChannel.max_chans_per_user);
+ snprintf(result, sizeof result, "%s:%i", allowed_chantypes, ConfigChannel.max_chans_per_user);
return result;
}
static int topiclen = TOPICLEN;
static int maxnicklen = NICKLEN - 1;
- add_isupport("CHANTYPES", isupport_chantypes, NULL);
+ add_isupport("CHANTYPES", isupport_stringptr, &allowed_chantypes);
add_isupport("EXCEPTS", isupport_boolean, &ConfigChannel.use_except);
add_isupport("INVEX", isupport_boolean, &ConfigChannel.use_invex);
add_isupport("CHANMODES", isupport_chanmodes, NULL);
add_isupport("EXTBAN", isupport_extban, NULL);
add_isupport("CLIENTVER", isupport_string, "3.0");
}
+
+void
+chantypes_update(void)
+{
+ unsigned char *p;
+ memset(allowed_chantypes, '\0', sizeof allowed_chantypes);
+
+ p = (unsigned char *) allowed_chantypes;
+
+ for (unsigned int i = 0; i < 256; i++)
+ {
+ if (IsChanPrefix(i))
+ *p++ = (unsigned char) i;
+ }
+}
continue;
}
- /* check it begins with # or &, and local chans are disabled */
- else if(!IsChannelName(name) ||
- ( ConfigChannel.disable_local_channels && name[0] == '&'))
+ /* check it begins with a valid channel prefix per policy. */
+ else if (!IsChannelName(name))
{
sendto_one_numeric(source_p, ERR_NOSUCHCHANNEL,
form_str(ERR_NOSUCHCHANNEL), name);