]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - src/channel.c
WHOIS 330 (services login name) does not need a remote whois.
[irc/rqf/shadowircd.git] / src / channel.c
index d6161d0d65f8bdea8130245fa24e32f284a24f96..80bf5c5c2f5573d87e9055ace7f1f46a9396688d 100644 (file)
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
  *  USA
  *
- *  $Id: channel.c 3574 2007-10-27 21:56:53Z jilles $
+ *  $Id: channel.c 3580 2007-11-07 23:45:14Z jilles $
  */
 
 #include "stdinc.h"
-#include "tools.h"
 #include "channel.h"
+#include "chmode.h"
 #include "client.h"
 #include "common.h"
 #include "hash.h"
 #include "hook.h"
-#include "irc_string.h"
-#include "sprintf_irc.h"
+#include "match.h"
 #include "ircd.h"
 #include "numeric.h"
 #include "s_serv.h"            /* captab */
 #include "whowas.h"
 #include "s_conf.h"            /* ConfigFileEntry, ConfigChannel */
 #include "s_newconf.h"
-#include "event.h"
-#include "memory.h"
-#include "balloc.h"
-#include "s_log.h"
+#include "logger.h"
 
-extern dlink_list global_channel_list;
-
-extern struct config_channel_entry ConfigChannel;
-extern BlockHeap *channel_heap;
-extern BlockHeap *ban_heap;
-extern BlockHeap *topic_heap;
-extern BlockHeap *member_heap;
+struct config_channel_entry ConfigChannel;
+rb_dlink_list global_channel_list;
+static rb_bh *channel_heap;
+static rb_bh *ban_heap;
+static rb_bh *topic_heap;
+static rb_bh *member_heap;
 
 static int channel_capabs[] = { CAP_EX, CAP_IE,
        CAP_SERVICE,
@@ -77,10 +72,10 @@ static int h_can_join;
 void
 init_channels(void)
 {
-       channel_heap = BlockHeapCreate(sizeof(struct Channel), CHANNEL_HEAP_SIZE);
-       ban_heap = BlockHeapCreate(sizeof(struct Ban), BAN_HEAP_SIZE);
-       topic_heap = BlockHeapCreate(TOPICLEN + 1 + USERHOST_REPLYLEN, TOPIC_HEAP_SIZE);
-       member_heap = BlockHeapCreate(sizeof(struct membership), MEMBER_HEAP_SIZE);
+       channel_heap = rb_bh_create(sizeof(struct Channel), CHANNEL_HEAP_SIZE, "channel_heap");
+       ban_heap = rb_bh_create(sizeof(struct Ban), BAN_HEAP_SIZE, "ban_heap");
+       topic_heap = rb_bh_create(TOPICLEN + 1 + USERHOST_REPLYLEN, TOPIC_HEAP_SIZE, "topic_heap");
+       member_heap = rb_bh_create(sizeof(struct membership), MEMBER_HEAP_SIZE, "member_heap");
 
        h_can_join = register_hook("can_join");
 }
@@ -92,25 +87,25 @@ struct Channel *
 allocate_channel(const char *chname)
 {
        struct Channel *chptr;
-       chptr = BlockHeapAlloc(channel_heap);
-       DupNString(chptr->chname, chname, CHANNELLEN);
+       chptr = rb_bh_alloc(channel_heap);
+       chptr->chname = rb_strdup(chname);
        return (chptr);
 }
 
 void
 free_channel(struct Channel *chptr)
 {
-       MyFree(chptr->chname);
-       BlockHeapFree(channel_heap, chptr);
+       rb_free(chptr->chname);
+       rb_bh_free(channel_heap, chptr);
 }
 
 struct Ban *
 allocate_ban(const char *banstr, const char *who)
 {
        struct Ban *bptr;
-       bptr = BlockHeapAlloc(ban_heap);
-       DupNString(bptr->banstr, banstr, BANLEN);
-       DupNString(bptr->who, who, BANLEN);
+       bptr = rb_bh_alloc(ban_heap);
+       bptr->banstr = rb_strdup(banstr);
+       bptr->who = rb_strdup(who);
 
        return (bptr);
 }
@@ -118,9 +113,9 @@ allocate_ban(const char *banstr, const char *who)
 void
 free_ban(struct Ban *bptr)
 {
-       MyFree(bptr->banstr);
-       MyFree(bptr->who);
-       BlockHeapFree(ban_heap, bptr);
+       rb_free(bptr->banstr);
+       rb_free(bptr->who);
+       rb_bh_free(ban_heap, bptr);
 }
 
 
@@ -134,7 +129,7 @@ struct membership *
 find_channel_membership(struct Channel *chptr, struct Client *client_p)
 {
        struct membership *msptr;
-       dlink_node *ptr;
+       rb_dlink_node *ptr;
 
        if(!IsClient(client_p))
                return NULL;
@@ -142,9 +137,9 @@ find_channel_membership(struct Channel *chptr, struct Client *client_p)
        /* Pick the most efficient list to use to be nice to things like
         * CHANSERV which could be in a large number of channels
         */
-       if(dlink_list_length(&chptr->members) < dlink_list_length(&client_p->user->channel))
+       if(rb_dlink_list_length(&chptr->members) < rb_dlink_list_length(&client_p->user->channel))
        {
-               DLINK_FOREACH(ptr, chptr->members.head)
+               RB_DLINK_FOREACH(ptr, chptr->members.head)
                {
                        msptr = ptr->data;
 
@@ -154,7 +149,7 @@ find_channel_membership(struct Channel *chptr, struct Client *client_p)
        }
        else
        {
-               DLINK_FOREACH(ptr, client_p->user->channel.head)
+               RB_DLINK_FOREACH(ptr, client_p->user->channel.head)
                {
                        msptr = ptr->data;
 
@@ -209,17 +204,17 @@ add_user_to_channel(struct Channel *chptr, struct Client *client_p, int flags)
        if(client_p->user == NULL)
                return;
 
-       msptr = BlockHeapAlloc(member_heap);
+       msptr = rb_bh_alloc(member_heap);
 
        msptr->chptr = chptr;
        msptr->client_p = client_p;
        msptr->flags = flags;
 
-       dlinkAdd(msptr, &msptr->usernode, &client_p->user->channel);
-       dlinkAdd(msptr, &msptr->channode, &chptr->members);
+       rb_dlinkAdd(msptr, &msptr->usernode, &client_p->user->channel);
+       rb_dlinkAdd(msptr, &msptr->channode, &chptr->members);
 
        if(MyClient(client_p))
-               dlinkAdd(msptr, &msptr->locchannode, &chptr->locmembers);
+               rb_dlinkAdd(msptr, &msptr->locchannode, &chptr->locmembers);
 }
 
 /* remove_user_from_channel()
@@ -240,18 +235,16 @@ remove_user_from_channel(struct membership *msptr)
        client_p = msptr->client_p;
        chptr = msptr->chptr;
 
-       dlinkDelete(&msptr->usernode, &client_p->user->channel);
-       dlinkDelete(&msptr->channode, &chptr->members);
+       rb_dlinkDelete(&msptr->usernode, &client_p->user->channel);
+       rb_dlinkDelete(&msptr->channode, &chptr->members);
 
        if(client_p->servptr == &me)
-               dlinkDelete(&msptr->locchannode, &chptr->locmembers);
-
-       chptr->users_last = CurrentTime;
+               rb_dlinkDelete(&msptr->locchannode, &chptr->locmembers);
 
-       if(!(chptr->mode.mode & MODE_PERMANENT) && dlink_list_length(&chptr->members) <= 0)
+       if(!(chptr->mode.mode & MODE_PERMANENT) && rb_dlink_list_length(&chptr->members) <= 0)
                destroy_channel(chptr);
 
-       BlockHeapFree(member_heap, msptr);
+       rb_bh_free(member_heap, msptr);
 
        return;
 }
@@ -267,28 +260,26 @@ remove_user_from_channels(struct Client *client_p)
 {
        struct Channel *chptr;
        struct membership *msptr;
-       dlink_node *ptr;
-       dlink_node *next_ptr;
+       rb_dlink_node *ptr;
+       rb_dlink_node *next_ptr;
 
        if(client_p == NULL)
                return;
 
-       DLINK_FOREACH_SAFE(ptr, next_ptr, client_p->user->channel.head)
+       RB_DLINK_FOREACH_SAFE(ptr, next_ptr, client_p->user->channel.head)
        {
                msptr = ptr->data;
                chptr = msptr->chptr;
 
-               dlinkDelete(&msptr->channode, &chptr->members);
+               rb_dlinkDelete(&msptr->channode, &chptr->members);
 
                if(client_p->servptr == &me)
-                       dlinkDelete(&msptr->locchannode, &chptr->locmembers);
-
-               chptr->users_last = CurrentTime;
+                       rb_dlinkDelete(&msptr->locchannode, &chptr->locmembers);
 
-               if(!(chptr->mode.mode & MODE_PERMANENT) && dlink_list_length(&chptr->members) <= 0)
+               if(!(chptr->mode.mode & MODE_PERMANENT) && rb_dlink_list_length(&chptr->members) <= 0)
                        destroy_channel(chptr);
 
-               BlockHeapFree(member_heap, msptr);
+               rb_bh_free(member_heap, msptr);
        }
 
        client_p->user->channel.head = client_p->user->channel.tail = NULL;
@@ -306,12 +297,12 @@ void
 invalidate_bancache_user(struct Client *client_p)
 {
        struct membership *msptr;
-       dlink_node *ptr;
+       rb_dlink_node *ptr;
 
        if(client_p == NULL)
                return;
 
-       DLINK_FOREACH(ptr, client_p->user->channel.head)
+       RB_DLINK_FOREACH(ptr, client_p->user->channel.head)
        {
                msptr = ptr->data;
                msptr->bants = 0;
@@ -343,18 +334,18 @@ check_channel_name(const char *name)
 
 /* free_channel_list()
  *
- * input       - dlink list to free
+ * input       - rb_dlink list to free
  * output      -
  * side effects - list of b/e/I modes is cleared
  */
 void
-free_channel_list(dlink_list * list)
+free_channel_list(rb_dlink_list * list)
 {
-       dlink_node *ptr;
-       dlink_node *next_ptr;
+       rb_dlink_node *ptr;
+       rb_dlink_node *next_ptr;
        struct Ban *actualBan;
 
-       DLINK_FOREACH_SAFE(ptr, next_ptr, list->head)
+       RB_DLINK_FOREACH_SAFE(ptr, next_ptr, list->head)
        {
                actualBan = ptr->data;
                free_ban(actualBan);
@@ -373,9 +364,9 @@ free_channel_list(dlink_list * list)
 void
 destroy_channel(struct Channel *chptr)
 {
-       dlink_node *ptr, *next_ptr;
+       rb_dlink_node *ptr, *next_ptr;
 
-       DLINK_FOREACH_SAFE(ptr, next_ptr, chptr->invites.head)
+       RB_DLINK_FOREACH_SAFE(ptr, next_ptr, chptr->invites.head)
        {
                del_invite(chptr, ptr->data);
        }
@@ -389,7 +380,7 @@ destroy_channel(struct Channel *chptr)
        /* Free the topic */
        free_topic(chptr);
 
-       dlinkDelete(&chptr->node, &global_channel_list);
+       rb_dlinkDelete(&chptr->node, &global_channel_list);
        del_from_channel_hash(chptr->chname, chptr);
        free_channel(chptr);
 }
@@ -421,7 +412,7 @@ channel_member_names(struct Channel *chptr, struct Client *client_p, int show_eo
 {
        struct membership *msptr;
        struct Client *target_p;
-       dlink_node *ptr;
+       rb_dlink_node *ptr;
        char lbuf[BUFSIZE];
        char *t;
        int mlen;
@@ -434,13 +425,13 @@ channel_member_names(struct Channel *chptr, struct Client *client_p, int show_eo
        {
                is_member = IsMember(client_p, chptr);
 
-               cur_len = mlen = ircsprintf(lbuf, form_str(RPL_NAMREPLY),
+               cur_len = mlen = rb_sprintf(lbuf, form_str(RPL_NAMREPLY),
                                            me.name, client_p->name,
                                            channel_pub_or_secret(chptr), chptr->chname);
 
                t = lbuf + cur_len;
 
-               DLINK_FOREACH(ptr, chptr->members.head)
+               RB_DLINK_FOREACH(ptr, chptr->members.head)
                {
                        msptr = ptr->data;
                        target_p = msptr->client_p;
@@ -457,7 +448,7 @@ channel_member_names(struct Channel *chptr, struct Client *client_p, int show_eo
                                t = lbuf + mlen;
                        }
 
-                       tlen = ircsprintf(t, "%s%s ", find_channel_status(msptr, stack),
+                       tlen = rb_sprintf(t, "%s%s ", find_channel_status(msptr, stack),
                                          target_p->name);
 
                        cur_len += tlen;
@@ -492,8 +483,8 @@ channel_member_names(struct Channel *chptr, struct Client *client_p, int show_eo
 void
 del_invite(struct Channel *chptr, struct Client *who)
 {
-       dlinkFindDestroy(who, &chptr->invites);
-       dlinkFindDestroy(chptr, &who->user->invited);
+       rb_dlinkFindDestroy(who, &chptr->invites);
+       rb_dlinkFindDestroy(chptr, &who->user->invited);
 }
 
 /* is_banned()
@@ -511,7 +502,7 @@ is_banned(struct Channel *chptr, struct Client *who, struct membership *msptr,
        char src_iphost[NICKLEN + USERLEN + HOSTLEN + 6];
        char src_althost[NICKLEN + USERLEN + HOSTLEN + 6];
        char *s3 = NULL;
-       dlink_node *ptr;
+       rb_dlink_node *ptr;
        struct Ban *actualBan = NULL;
        struct Ban *actualExcept = NULL;
 
@@ -521,8 +512,8 @@ is_banned(struct Channel *chptr, struct Client *who, struct membership *msptr,
        /* if the buffers havent been built, do it here */
        if(s == NULL)
        {
-               ircsprintf(src_host, "%s!%s@%s", who->name, who->username, who->host);
-               ircsprintf(src_iphost, "%s!%s@%s", who->name, who->username, who->sockhost);
+               rb_sprintf(src_host, "%s!%s@%s", who->name, who->username, who->host);
+               rb_sprintf(src_iphost, "%s!%s@%s", who->name, who->username, who->sockhost);
 
                s = src_host;
                s2 = src_iphost;
@@ -532,19 +523,19 @@ is_banned(struct Channel *chptr, struct Client *who, struct membership *msptr,
                /* if host mangling mode enabled, also check their real host */
                if(!strcmp(who->host, who->localClient->mangledhost))
                {
-                       ircsprintf(src_althost, "%s!%s@%s", who->name, who->username, who->orighost);
+                       rb_sprintf(src_althost, "%s!%s@%s", who->name, who->username, who->orighost);
                        s3 = src_althost;
                }
                /* if host mangling mode not enabled and no other spoof,
                 * also check the mangled form of their host */
                else if (!IsDynSpoof(who))
                {
-                       ircsprintf(src_althost, "%s!%s@%s", who->name, who->username, who->localClient->mangledhost);
+                       rb_sprintf(src_althost, "%s!%s@%s", who->name, who->username, who->localClient->mangledhost);
                        s3 = src_althost;
                }
        }
 
-       DLINK_FOREACH(ptr, chptr->banlist.head)
+       RB_DLINK_FOREACH(ptr, chptr->banlist.head)
        {
                actualBan = ptr->data;
                if(match(actualBan->banstr, s) ||
@@ -559,7 +550,7 @@ is_banned(struct Channel *chptr, struct Client *who, struct membership *msptr,
 
        if((actualBan != NULL) && ConfigChannel.use_except)
        {
-               DLINK_FOREACH(ptr, chptr->exceptlist.head)
+               RB_DLINK_FOREACH(ptr, chptr->exceptlist.head)
                {
                        actualExcept = ptr->data;
 
@@ -617,7 +608,7 @@ is_quieted(struct Channel *chptr, struct Client *who, struct membership *msptr,
        char src_iphost[NICKLEN + USERLEN + HOSTLEN + 6];
        char src_althost[NICKLEN + USERLEN + HOSTLEN + 6];
        char *s3 = NULL;
-       dlink_node *ptr;
+       rb_dlink_node *ptr;
        struct Ban *actualBan = NULL;
        struct Ban *actualExcept = NULL;
 
@@ -627,8 +618,8 @@ is_quieted(struct Channel *chptr, struct Client *who, struct membership *msptr,
        /* if the buffers havent been built, do it here */
        if(s == NULL)
        {
-               ircsprintf(src_host, "%s!%s@%s", who->name, who->username, who->host);
-               ircsprintf(src_iphost, "%s!%s@%s", who->name, who->username, who->sockhost);
+               rb_sprintf(src_host, "%s!%s@%s", who->name, who->username, who->host);
+               rb_sprintf(src_iphost, "%s!%s@%s", who->name, who->username, who->sockhost);
 
                s = src_host;
                s2 = src_iphost;
@@ -638,19 +629,19 @@ is_quieted(struct Channel *chptr, struct Client *who, struct membership *msptr,
                /* if host mangling mode enabled, also check their real host */
                if(!strcmp(who->host, who->localClient->mangledhost))
                {
-                       ircsprintf(src_althost, "%s!%s@%s", who->name, who->username, who->orighost);
+                       rb_sprintf(src_althost, "%s!%s@%s", who->name, who->username, who->orighost);
                        s3 = src_althost;
                }
                /* if host mangling mode not enabled and no other spoof,
                 * also check the mangled form of their host */
                else if (!IsDynSpoof(who))
                {
-                       ircsprintf(src_althost, "%s!%s@%s", who->name, who->username, who->localClient->mangledhost);
+                       rb_sprintf(src_althost, "%s!%s@%s", who->name, who->username, who->localClient->mangledhost);
                        s3 = src_althost;
                }
        }
 
-       DLINK_FOREACH(ptr, chptr->quietlist.head)
+       RB_DLINK_FOREACH(ptr, chptr->quietlist.head)
        {
                actualBan = ptr->data;
                if(match(actualBan->banstr, s) ||
@@ -665,7 +656,7 @@ is_quieted(struct Channel *chptr, struct Client *who, struct membership *msptr,
 
        if((actualBan != NULL) && ConfigChannel.use_except)
        {
-               DLINK_FOREACH(ptr, chptr->exceptlist.head)
+               RB_DLINK_FOREACH(ptr, chptr->exceptlist.head)
                {
                        actualExcept = ptr->data;
 
@@ -717,8 +708,8 @@ is_quieted(struct Channel *chptr, struct Client *who, struct membership *msptr,
 int
 can_join(struct Client *source_p, struct Channel *chptr, char *key)
 {
-       dlink_node *invite = NULL;
-       dlink_node *ptr;
+       rb_dlink_node *invite = NULL;
+       rb_dlink_node *ptr;
        struct Ban *invex = NULL;
        char src_host[NICKLEN + USERLEN + HOSTLEN + 6];
        char src_iphost[NICKLEN + USERLEN + HOSTLEN + 6];
@@ -729,21 +720,21 @@ can_join(struct Client *source_p, struct Channel *chptr, char *key)
 
        s_assert(source_p->localClient != NULL);
 
-       ircsprintf(src_host, "%s!%s@%s", source_p->name, source_p->username, source_p->host);
-       ircsprintf(src_iphost, "%s!%s@%s", source_p->name, source_p->username, source_p->sockhost);
+       rb_sprintf(src_host, "%s!%s@%s", source_p->name, source_p->username, source_p->host);
+       rb_sprintf(src_iphost, "%s!%s@%s", source_p->name, source_p->username, source_p->sockhost);
        if(source_p->localClient->mangledhost != NULL)
        {
                /* if host mangling mode enabled, also check their real host */
                if(!strcmp(source_p->host, source_p->localClient->mangledhost))
                {
-                       ircsprintf(src_althost, "%s!%s@%s", source_p->name, source_p->username, source_p->orighost);
+                       rb_sprintf(src_althost, "%s!%s@%s", source_p->name, source_p->username, source_p->orighost);
                        use_althost = 1;
                }
                /* if host mangling mode not enabled and no other spoof,
                 * also check the mangled form of their host */
                else if (!IsDynSpoof(source_p))
                {
-                       ircsprintf(src_althost, "%s!%s@%s", source_p->name, source_p->username, source_p->localClient->mangledhost);
+                       rb_sprintf(src_althost, "%s!%s@%s", source_p->name, source_p->username, source_p->localClient->mangledhost);
                        use_althost = 1;
                }
        }
@@ -753,7 +744,7 @@ can_join(struct Client *source_p, struct Channel *chptr, char *key)
 
        if(chptr->mode.mode & MODE_INVITEONLY)
        {
-               DLINK_FOREACH(invite, source_p->user->invited.head)
+               RB_DLINK_FOREACH(invite, source_p->user->invited.head)
                {
                        if(invite->data == chptr)
                                break;
@@ -762,7 +753,7 @@ can_join(struct Client *source_p, struct Channel *chptr, char *key)
                {
                        if(!ConfigChannel.use_invex)
                                return (ERR_INVITEONLYCHAN);
-                       DLINK_FOREACH(ptr, chptr->invexlist.head)
+                       RB_DLINK_FOREACH(ptr, chptr->invexlist.head)
                        {
                                invex = ptr->data;
                                if(match(invex->banstr, src_host)
@@ -781,14 +772,14 @@ can_join(struct Client *source_p, struct Channel *chptr, char *key)
                return (ERR_BADCHANNELKEY);
 
        if(chptr->mode.limit &&
-          dlink_list_length(&chptr->members) >= (unsigned long) chptr->mode.limit)
+          rb_dlink_list_length(&chptr->members) >= (unsigned long) chptr->mode.limit)
                i = ERR_CHANNELISFULL;
        if(chptr->mode.mode & MODE_REGONLY && EmptyString(source_p->user->suser))
                i = ERR_NEEDREGGEDNICK;
        /* join throttling stuff --nenolod */
        else if(chptr->mode.join_num > 0 && chptr->mode.join_time > 0)
        {
-               if ((CurrentTime - chptr->join_delta <= 
+               if ((rb_current_time() - chptr->join_delta <= 
                        chptr->mode.join_time) && (chptr->join_count >=
                        chptr->mode.join_num))
                        i = ERR_THROTTLE;
@@ -797,7 +788,7 @@ can_join(struct Client *source_p, struct Channel *chptr, char *key)
        /* allow /invite to override +l/+r/+j also -- jilles */
        if (i != 0 && invite == NULL)
        {
-               DLINK_FOREACH(invite, source_p->user->invited.head)
+               RB_DLINK_FOREACH(invite, source_p->user->invited.head)
                {
                        if(invite->data == chptr)
                                break;
@@ -879,17 +870,17 @@ find_bannickchange_channel(struct Client *client_p)
 {
        struct Channel *chptr;
        struct membership *msptr;
-       dlink_node *ptr;
+       rb_dlink_node *ptr;
        char src_host[NICKLEN + USERLEN + HOSTLEN + 6];
        char src_iphost[NICKLEN + USERLEN + HOSTLEN + 6];
 
        if (!MyClient(client_p))
                return NULL;
 
-       ircsprintf(src_host, "%s!%s@%s", client_p->name, client_p->username, client_p->host);
-       ircsprintf(src_iphost, "%s!%s@%s", client_p->name, client_p->username, client_p->sockhost);
+       rb_sprintf(src_host, "%s!%s@%s", client_p->name, client_p->username, client_p->host);
+       rb_sprintf(src_iphost, "%s!%s@%s", client_p->name, client_p->username, client_p->sockhost);
 
-       DLINK_FOREACH(ptr, client_p->user->channel.head)
+       RB_DLINK_FOREACH(ptr, client_p->user->channel.head)
        {
                msptr = ptr->data;
                chptr = msptr->chptr;
@@ -927,26 +918,21 @@ check_spambot_warning(struct Client *source_p, const char *name)
                        source_p->localClient->oper_warn_count_down--;
                else
                        source_p->localClient->oper_warn_count_down = 0;
-               if(source_p->localClient->oper_warn_count_down == 0)
+               if(source_p->localClient->oper_warn_count_down == 0 &&
+                               name != NULL)
                {
                        /* Its already known as a possible spambot */
-                       if(name != NULL)
-                               sendto_realops_snomask(SNO_BOTS, L_ALL,
-                                                    "User %s (%s@%s) trying to join %s is a possible spambot",
-                                                    source_p->name,
-                                                    source_p->username, source_p->orighost, name);
-                       else
-                               sendto_realops_snomask(SNO_BOTS, L_ALL,
-                                                    "User %s (%s@%s) is a possible spambot",
-                                                    source_p->name,
-                                                    source_p->username, source_p->orighost);
+                       sendto_realops_snomask(SNO_BOTS, L_NETWIDE,
+                                            "User %s (%s@%s) trying to join %s is a possible spambot",
+                                            source_p->name,
+                                            source_p->username, source_p->orighost, name);
                        source_p->localClient->oper_warn_count_down = OPER_SPAM_COUNTDOWN;
                }
        }
        else
        {
                if((t_delta =
-                   (CurrentTime - source_p->localClient->last_leave_time)) >
+                   (rb_current_time() - source_p->localClient->last_leave_time)) >
                   JOIN_LEAVE_COUNT_EXPIRE_TIME)
                {
                        decrement_count = (t_delta / JOIN_LEAVE_COUNT_EXPIRE_TIME);
@@ -957,7 +943,7 @@ check_spambot_warning(struct Client *source_p, const char *name)
                }
                else
                {
-                       if((CurrentTime -
+                       if((rb_current_time() -
                            (source_p->localClient->last_join_time)) < GlobalSetOptions.spam_time)
                        {
                                /* oh, its a possible spambot */
@@ -965,9 +951,9 @@ check_spambot_warning(struct Client *source_p, const char *name)
                        }
                }
                if(name != NULL)
-                       source_p->localClient->last_join_time = CurrentTime;
+                       source_p->localClient->last_join_time = rb_current_time();
                else
-                       source_p->localClient->last_leave_time = CurrentTime;
+                       source_p->localClient->last_leave_time = rb_current_time();
        }
 }
 
@@ -993,7 +979,7 @@ check_splitmode(void *unused)
                                splitmode = 1;
                                sendto_realops_snomask(SNO_GENERAL, L_ALL,
                                                     "Network split, activating splitmode");
-                               eventAddIsh("check_splitmode", check_splitmode, NULL, 2);
+                               check_splitmode_ev = rb_event_addish("check_splitmode", check_splitmode, NULL, 2);
                        }
                }
                /* in splitmode, check whether its finished */
@@ -1004,7 +990,8 @@ check_splitmode(void *unused)
                        sendto_realops_snomask(SNO_GENERAL, L_ALL,
                                             "Network rejoined, deactivating splitmode");
 
-                       eventDelete(check_splitmode, NULL);
+                       rb_event_delete(check_splitmode_ev);
+                       check_splitmode_ev = NULL;
                }
        }
 }
@@ -1024,7 +1011,7 @@ allocate_topic(struct Channel *chptr)
        if(chptr == NULL)
                return;
 
-       ptr = BlockHeapAlloc(topic_heap);
+       ptr = rb_bh_alloc(topic_heap);
 
        /* Basically we allocate one large block for the topic and
         * the topic info.  We then split it up into two and shove it
@@ -1054,7 +1041,7 @@ free_topic(struct Channel *chptr)
         * MUST change this as well
         */
        ptr = chptr->topic;
-       BlockHeapFree(topic_heap, ptr);
+       rb_bh_free(topic_heap, ptr);
        chptr->topic = NULL;
        chptr->topic_info = NULL;
 }
@@ -1072,8 +1059,8 @@ set_channel_topic(struct Channel *chptr, const char *topic, const char *topic_in
        {
                if(chptr->topic == NULL)
                        allocate_topic(chptr);
-               strlcpy(chptr->topic, topic, TOPICLEN + 1);
-               strlcpy(chptr->topic_info, topic_info, USERHOST_REPLYLEN);
+               rb_strlcpy(chptr->topic, topic, TOPICLEN + 1);
+               rb_strlcpy(chptr->topic_info, topic_info, USERHOST_REPLYLEN);
                chptr->topic_time = topicts;
        }
        else
@@ -1084,29 +1071,6 @@ set_channel_topic(struct Channel *chptr, const char *topic, const char *topic_in
        }
 }
 
-static const struct mode_letter
-{
-       const unsigned int mode;
-       const unsigned char letter;
-} flags[] =
-{
-       {MODE_INVITEONLY, 'i'},
-       {MODE_MODERATED, 'm'},
-       {MODE_NOPRIVMSGS, 'n'},
-       {MODE_PRIVATE, 'p'},
-       {MODE_SECRET, 's'},
-       {MODE_TOPICLIMIT, 't'},
-       {MODE_NOCOLOR, 'c'},
-       {MODE_FREEINVITE, 'g'},
-       {MODE_OPMODERATE, 'z'},
-       {MODE_EXLIMIT, 'L'},
-       {MODE_PERMANENT, 'P'},
-       {MODE_FREETARGET, 'F'},
-       {MODE_DISFORWARD, 'Q'},
-       {MODE_REGONLY, 'r'},
-       {0, '\0'}
-};
-
 /* channel_modes()
  *
  * inputs       - pointer to channel
@@ -1129,16 +1093,16 @@ channel_modes(struct Channel *chptr, struct Client *client_p)
        *mbuf++ = '+';
        *pbuf = '\0';
 
-       for (i = 0; flags[i].mode; ++i)
-               if(chptr->mode.mode & flags[i].mode)
-                       *mbuf++ = flags[i].letter;
+       for (i = 0; i < 256; i++)
+               if(chptr->mode.mode & chmode_flags[i])
+                       *mbuf++ = i;
 
        if(chptr->mode.limit)
        {
                *mbuf++ = 'l';
 
                if(!IsClient(client_p) || IsMember(client_p, chptr))
-                       pbuf += ircsprintf(pbuf, " %d", chptr->mode.limit);
+                       pbuf += rb_sprintf(pbuf, " %d", chptr->mode.limit);
        }
 
        if(*chptr->mode.key)
@@ -1146,7 +1110,7 @@ channel_modes(struct Channel *chptr, struct Client *client_p)
                *mbuf++ = 'k';
 
                if(pbuf > buf2 || !IsClient(client_p) || IsMember(client_p, chptr))
-                       pbuf += ircsprintf(pbuf, " %s", chptr->mode.key);
+                       pbuf += rb_sprintf(pbuf, " %s", chptr->mode.key);
        }
 
        if(chptr->mode.join_num)
@@ -1154,7 +1118,7 @@ channel_modes(struct Channel *chptr, struct Client *client_p)
                *mbuf++ = 'j';
 
                if(pbuf > buf2 || !IsClient(client_p) || IsMember(client_p, chptr))
-                       pbuf += ircsprintf(pbuf, " %d:%d", chptr->mode.join_num,
+                       pbuf += rb_sprintf(pbuf, " %d:%d", chptr->mode.join_num,
                                           chptr->mode.join_time);
        }
 
@@ -1163,13 +1127,13 @@ channel_modes(struct Channel *chptr, struct Client *client_p)
                *mbuf++ = 'f';
 
                if(pbuf > buf2 || !IsClient(client_p) || IsMember(client_p, chptr))
-                       pbuf += ircsprintf(pbuf, " %s", chptr->mode.forward);
+                       pbuf += rb_sprintf(pbuf, " %s", chptr->mode.forward);
        }
 
        *mbuf = '\0';
 
-       strlcpy(final, buf1, sizeof final);
-       strlcat(final, buf2, sizeof final);
+       rb_strlcpy(final, buf1, sizeof final);
+       rb_strlcat(final, buf2, sizeof final);
        return final;
 }
 
@@ -1312,13 +1276,9 @@ send_cap_mode_changes(struct Client *client_p, struct Client *source_p,
                cap = chcap_combos[j].cap_yes;
                nocap = chcap_combos[j].cap_no;
 
-               if(cap & CAP_TS6)
-                       mbl = preflen = ircsprintf(modebuf, ":%s TMODE %ld %s ",
-                                                  use_id(source_p), (long) chptr->channelts,
-                                                  chptr->chname);
-               else
-                       mbl = preflen = ircsprintf(modebuf, ":%s MODE %s ",
-                                                  source_p->name, chptr->chname);
+               mbl = preflen = rb_sprintf(modebuf, ":%s TMODE %ld %s ",
+                                          use_id(source_p), (long) chptr->channelts,
+                                          chptr->chname);
 
                /* loop the list of - modes we have */
                for (i = 0; i < mode_count; i++)
@@ -1332,7 +1292,7 @@ send_cap_mode_changes(struct Client *client_p, struct Client *source_p,
                           || ((nocap & mode_changes[i].nocaps) != mode_changes[i].nocaps))
                                continue;
 
-                       if((cap & CAP_TS6) && !EmptyString(mode_changes[i].id))
+                       if(!EmptyString(mode_changes[i].id))
                                arg = mode_changes[i].id;
                        else
                                arg = mode_changes[i].arg;
@@ -1381,7 +1341,7 @@ send_cap_mode_changes(struct Client *client_p, struct Client *source_p,
 
                        if(arg != NULL)
                        {
-                               len = ircsprintf(pbuf, "%s ", arg);
+                               len = rb_sprintf(pbuf, "%s ", arg);
                                pbuf += len;
                                pbl += len;
                                mc++;