فهرست منبع

Merge branch 'queue-cleanups'

* queue-cleanups:
  * Ensure not in burst mode when flushing cookies
  * Flush channel mode queues in clear_channel()
  * Only flush modes for a channel if opped
  * Unset modesperline when disconnecting
Bryan Drewery 16 سال پیش
والد
کامیت
ec2c8883d6
5فایلهای تغییر یافته به همراه15 افزوده شده و 6 حذف شده
  1. 0 6
      src/mod/channels.mod/channels.c
  2. 10 0
      src/mod/channels.mod/tclchan.c
  3. 1 0
      src/mod/irc.mod/irc.c
  4. 3 0
      src/mod/irc.mod/mode.c
  5. 1 0
      src/mod/server.mod/servmsg.c

+ 0 - 6
src/mod/channels.mod/channels.c

@@ -693,8 +693,6 @@ static inline bool chanset_unlink(struct chanset_t *chan)
  */
 void remove_channel(struct chanset_t *chan)
 {
-   int i;
-
    if (chan != chanset_default) {
      irc_log(chan, "Parting");
      /* Remove the channel from the list, so that noone can pull it
@@ -721,10 +719,6 @@ void remove_channel(struct chanset_t *chan)
      noshare = 0;
    }
    free(chan->channel.key);
-   for (i = 0; i < MODES_PER_LINE_MAX && chan->cmode[i].op; i++)
-     free(chan->cmode[i].op);
-   for (i = 0; i < (MODES_PER_LINE_MAX - 1) && chan->ccmode[i].op; i++)
-     free(chan->ccmode[i].op);
    if (chan->key)
      free(chan->key);
    if (chan->rmkey)

+ 10 - 0
src/mod/channels.mod/tclchan.c

@@ -918,6 +918,16 @@ void clear_channel(struct chanset_t *chan, bool reset)
 
   if (reset)
     init_channel(chan, 1);
+  for (size_t i = 0; i < MODES_PER_LINE_MAX; ++i) {
+    if (chan->cmode[i].op) {
+      free(chan->cmode[i].op);
+      chan->cmode[i].op = NULL;
+    }
+    if (chan->ccmode[i].op) {
+      free(chan->ccmode[i].op);
+      chan->ccmode[i].op = NULL;
+    }
+  }
 }
 
 /* Create new channel and parse commands.

+ 1 - 0
src/mod/irc.mod/irc.c

@@ -1729,6 +1729,7 @@ flush_modes()
   Context;
 
   for (register struct chanset_t *chan = chanset; chan; chan = chan->next) {
+    if (!me_op(chan)) continue;
     for (m = chan->channel.member; m && m->nick[0]; m = m->next) {
       if (m->delay && m->delay <= now) {
         m->delay = 0L;

+ 3 - 0
src/mod/irc.mod/mode.c

@@ -114,6 +114,9 @@ do_op(char *nick, struct chanset_t *chan, bool delay, bool force)
 static void
 flush_cookies(struct chanset_t *chan, int pri)
 {
+  if (connect_bursting) // Make sure not in burst mode
+    return;
+
   char out[512] = "", *p = out, post[512] = "";
   size_t postsize = sizeof(post) - 1;
   memberlist *nicks[3] = { NULL, NULL, NULL };

+ 1 - 0
src/mod/server.mod/servmsg.c

@@ -1284,6 +1284,7 @@ static void disconnect_server(int idx, int dolost)
   have_cprivmsg = 0;
   have_cnotice = 0;
   use_flood_count = 0;
+  modesperline = 0;
   if (dolost) {
     Auth::DeleteAll();
     trying_server = 0;