MODULE_VERSION("");
-#define channelhash(x) (crc32i(x)%CHANNELHASHSIZE)
+#define channelhash(x) (irc_crc32i(x)%CHANNELHASHSIZE)
unsigned long nouser;
void sendchanburst(int hooknum, void *arg);
void _init() {
- /* Initialise internal structures */
- initchannelalloc();
-
/* Set up the nouser marker according to our own numeric */
nouser=(mylongnum<<18)|CU_NOUSERMASK;
+ /* If we're connected to IRC, force a disconnect. This needs to be done
+ * before we register all our hooks which would otherwise get called
+ * during the disconnect. */
+ if (connected) {
+ irc_send("%s SQ %s 0 :Resync [adding channel support]",mynumeric->content,myserver->content); irc_disconnected(0);
+ }
+
/* Set up our hooks */
registerhook(HOOK_NICK_NEWNICK,&addordelnick);
registerhook(HOOK_NICK_LOSTNICK,&addordelnick);
registerserverhandler("M",&handlemodemsg,8);
registerserverhandler("OM",&handlemodemsg,8); /* Treat OPMODE just like MODE */
registerserverhandler("CM",&handleclearmodemsg,2);
-
- /* If we're connected to IRC, force a disconnect */
- if (connected) {
- irc_send("%s SQ %s 0 :Resync [adding channel support]",mynumeric->content,myserver->content);
- irc_disconnected();
- }
}
void _fini() {
for(i=0;i<CHANNELHASHSIZE;i++) {
for (cip=chantable[i];cip;cip=ncip) {
ncip=cip->next;
- if (!(cp=cip->channel))
- continue;
-
- delchannel(cp);
+ if ((cp=cip->channel))
+ delchannel(cp);
}
}
void *args[2];
if ((np=getnickbynumeric(numeric&CU_NUMERICMASK))==NULL) {
- Error("channel",ERR_ERROR,"Trying to remove non-existent nick %d from channel %s",numeric,cp->index->name);
+ Error("channel",ERR_ERROR,"Trying to remove non-existent nick %lu from channel %s",numeric,cp->index->name->content);
return;
}
continue;
if ((np=getnickbynumeric(cp->users->content[i]))==NULL) {
- Error("channel",ERR_ERROR,"Found unknown numeric %u on channel %s",cp->users->content[i],cp->index->name->content);
+ Error("channel",ERR_ERROR,"Found unknown numeric %lu on channel %s",cp->users->content[i],cp->index->name->content);
continue;
}
return count;
}
+/*
+ * clean_key: returns a "cleaned" version of the key like ircu does.
+ *
+ * Note that s is a signed char, so we are basically allowing everything from 33-127 except : or ,
+ *
+ * Unlike ircu we don't check against KEYLEN here, this is done elsewhere.
+ */
+void clean_key(char *key) {
+ for (;*key;key++) {
+ if (*key<=32 || *key==':' || *key==',') {
+ *key=0;
+ return;
+ }
+ }
+}