Author: Bleep <helveytw@home.com>
[ircu2.10.12-pk.git] / ircd / channel.c
index cbc46abfaf78e04774ff882fb9c4a423ffdc9568..1c544bcd4d22c91909885e3765ba55e6b5f111a9 100644 (file)
@@ -53,6 +53,9 @@
 
 struct Channel* GlobalChannelList = 0;
 
+static unsigned int membershipAllocCount;
+static struct Membership* membershipFreeList;
+
 static struct SLink *next_overlapped_ban(void);
 static int del_banid(struct Channel *, char *, int);
 void del_invite(struct Client *, struct Channel *);
@@ -94,7 +97,7 @@ struct Membership* find_member_link(struct Channel* chptr, const struct Client*
   assert(0 != chptr);
   
   /* Servers don't have member links */
-  if (IsServer(cptr))
+  if (IsServer(cptr)||IsMe(cptr))
      return 0;
   
   /* +k users are typically on a LOT of channels.  So we iterate over who
@@ -227,7 +230,7 @@ int sub1_from_channel(struct Channel* chptr)
     int i;
     for (i = 0; i <= HighestFd; i++)
     {
-      struct Client *acptr;
+      struct Client *acptr = 0;
       if ((acptr = LocalClientArray[i]) && acptr->listing &&
           acptr->listing->chptr == chptr)
       {
@@ -530,8 +533,15 @@ void add_user_to_channel(struct Channel* chptr, struct Client* who,
   assert(0 != who);
 
   if (who->user) {
-    struct Membership* member = 
-            (struct Membership*) MyMalloc(sizeof(struct Membership));
+   
+    struct Membership* member = membershipFreeList;
+    if (member)
+      membershipFreeList = member->next_member;
+    else {
+      member = (struct Membership*) MyMalloc(sizeof(struct Membership));
+      ++membershipAllocCount;
+    }
+
     assert(0 != member);
     member->user         = who;
     member->channel      = chptr;
@@ -580,7 +590,9 @@ static int remove_member_from_channel(struct Membership* member)
     member->user->user->channel = member->next_channel;
 
   --member->user->user->joined;
-  MyFree(member);
+
+  member->next_member = membershipFreeList;
+  membershipFreeList = member;
 
   return sub1_from_channel(chptr);
 }
@@ -3564,13 +3576,8 @@ mode_parse_client(struct ParseState *state, int *flag_p)
   if (MyUser(state->sptr) && state->max_args <= 0) /* drop if too many args */
     return;
 
-  if (state->parc <= 0) { /* warn if not enough args */
-    if (MyUser(state->sptr))
-      need_more_params(state->sptr, state->dir == MODE_ADD ?
-                      (flag_p[0] == MODE_CHANOP ? "MODE +o" : "MODE +v") :
-                      (flag_p[0] == MODE_CHANOP ? "MODE -o" : "MODE -v"));
+  if (state->parc <= 0) /* return if not enough args */
     return;
-  }
 
   t_str = state->parv[state->args_used++]; /* grab arg */
   state->parc--;
@@ -3944,7 +3951,8 @@ joinbuf_join(struct JoinBuf *jbuf, struct Channel *chan, unsigned int flags)
        * exactly the same logic, albeit somewhat more concise, as was in
        * the original m_part.c */
 
-      if (jbuf->jb_type == JOINBUF_TYPE_PARTALL) /* got to remove user here */
+      if (jbuf->jb_type == JOINBUF_TYPE_PARTALL ||
+         IsLocalChannel(chan->chname)) /* got to remove user here */
        remove_user_from_channel(jbuf->jb_source, chan);
     } else {
       /* Add user to channel */