Sfoglia il codice sorgente

* Port [3479] to 1.2.14
* Optimize get_user_flagrec slightly



svn: 3480

Bryan Drewery 19 anni fa
parent
commit
1540326701

+ 1 - 1
src/chanprog.c

@@ -779,7 +779,7 @@ bool shouldjoin(struct chanset_t *chan)
 {
 {
   if (conf.bot->u) {
   if (conf.bot->u) {
     struct flag_record fr = { FR_CHAN|FR_GLOBAL|FR_BOT, 0, 0, 0 };
     struct flag_record fr = { FR_CHAN|FR_GLOBAL|FR_BOT, 0, 0, 0 };
-    get_user_flagrec(conf.bot->u, &fr, chan->dname);
+    get_user_flagrec(conf.bot->u, &fr, chan->dname, chan);
     return bot_shouldjoin(conf.bot->u, &fr, chan);
     return bot_shouldjoin(conf.bot->u, &fr, chan);
   }
   }
   return 0;
   return 0;

+ 4 - 7
src/flags.c

@@ -360,7 +360,7 @@ set_user_flagrec(struct userrec *u, struct flag_record *fr, const char *chname)
 /* Always pass the dname (display name) to this function for chname <cybah>
 /* Always pass the dname (display name) to this function for chname <cybah>
  */
  */
 void
 void
-get_user_flagrec(struct userrec *u, struct flag_record *fr, const char *chname)
+get_user_flagrec(struct userrec *u, struct flag_record *fr, const char *chname, struct chanset_t* chan)
 {
 {
   fr->bot = 0;
   fr->bot = 0;
   if (!u) {
   if (!u) {
@@ -371,11 +371,8 @@ get_user_flagrec(struct userrec *u, struct flag_record *fr, const char *chname)
 
 
   if (u->bot)
   if (u->bot)
     fr->bot = 1;
     fr->bot = 1;
-  if (fr->match & FR_GLOBAL) {
-    fr->global = u->flags;
-  } else {
-    fr->global = 0;
-  }
+
+  fr->global = (fr->match & FR_GLOBAL) ? u->flags : 0;
 
 
   if (fr->match & FR_CHAN) {
   if (fr->match & FR_CHAN) {
     struct chanuserrec *cr = NULL;
     struct chanuserrec *cr = NULL;
@@ -384,7 +381,7 @@ get_user_flagrec(struct userrec *u, struct flag_record *fr, const char *chname)
       if (fr->match & FR_ANYWH)
       if (fr->match & FR_ANYWH)
         fr->chan = u->flags;
         fr->chan = u->flags;
       for (cr = u->chanrec; cr; cr = cr->next) {
       for (cr = u->chanrec; cr; cr = cr->next) {
-        if (findchan_by_dname(cr->channel)) {
+        if (chan || findchan_by_dname(cr->channel)) {
           fr->chan |= cr->flags;
           fr->chan |= cr->flags;
         }
         }
       }
       }

+ 1 - 1
src/flags.h

@@ -142,7 +142,7 @@ struct flag_record {
 #define chan_doflood(x)				((x).chan & BOT_FLOODBOT)
 #define chan_doflood(x)				((x).chan & BOT_FLOODBOT)
 
 
 void init_flags(void);
 void init_flags(void);
-void get_user_flagrec(struct userrec *, struct flag_record *, const char *);
+void get_user_flagrec(struct userrec *, struct flag_record *, const char *, struct chanset_t* = NULL);
 void set_user_flagrec(struct userrec *, struct flag_record *, const char *);
 void set_user_flagrec(struct userrec *, struct flag_record *, const char *);
 void break_down_flags(const char *, struct flag_record *, struct flag_record *);
 void break_down_flags(const char *, struct flag_record *, struct flag_record *);
 int build_flags(char *, struct flag_record *, struct flag_record *);
 int build_flags(char *, struct flag_record *, struct flag_record *);

+ 2 - 2
src/mod/channels.mod/channels.c

@@ -744,7 +744,7 @@ static int channels_chon(char *handle, int idx)
 	find = USER_OP;
 	find = USER_OP;
       fr.match = FR_CHAN;
       fr.match = FR_CHAN;
       while (chan && !found) {
       while (chan && !found) {
-	get_user_flagrec(dcc[idx].user, &fr, chan->dname);
+	get_user_flagrec(dcc[idx].user, &fr, chan->dname, chan);
 	if (fr.chan & find)
 	if (fr.chan & find)
 	  found = 1;
 	  found = 1;
 	else
 	else
@@ -775,7 +775,7 @@ void channels_report(int idx, int details)
 
 
   for (struct chanset_t *chan = chanset; chan; chan = chan->next) {
   for (struct chanset_t *chan = chanset; chan; chan = chan->next) {
     if (idx != DP_STDOUT)
     if (idx != DP_STDOUT)
-      get_user_flagrec(dcc[idx].user, &fr, chan->dname);
+      get_user_flagrec(dcc[idx].user, &fr, chan->dname, chan);
     if (!privchan(fr, chan, PRIV_OP) && ((idx == DP_STDOUT) || glob_master(fr) || chan_master(fr))) {
     if (!privchan(fr, chan, PRIV_OP) && ((idx == DP_STDOUT) || glob_master(fr) || chan_master(fr))) {
 
 
       s[0] = 0;
       s[0] = 0;

+ 1 - 1
src/mod/channels.mod/userchan.c

@@ -457,7 +457,7 @@ static void tell_masks(const char type, int idx, bool show_inact, char *match, b
     chan = NULL;
     chan = NULL;
 
 
   while (chan) {
   while (chan) {
-  get_user_flagrec(dcc[idx].user, &user, chan->dname);
+  get_user_flagrec(dcc[idx].user, &user, chan->dname, chan);
   if (privchan(user, chan, PRIV_OP)) {
   if (privchan(user, chan, PRIV_OP)) {
     if (all) goto next;
     if (all) goto next;
     dprintf(idx, "No such channel defined.\n");
     dprintf(idx, "No such channel defined.\n");

+ 14 - 14
src/mod/irc.mod/chan.c

@@ -217,7 +217,7 @@ void priority_do(struct chanset_t * chan, bool opsonly, int action)
     } else if (!opsonly || chan_hasop(m)) {
     } else if (!opsonly || chan_hasop(m)) {
         struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0 };
         struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0 };
         if (m->user)
         if (m->user)
-          get_user_flagrec(m->user, &fr, chan->dname);
+          get_user_flagrec(m->user, &fr, chan->dname, chan);
 
 
         if (((glob_deop(fr) && !chan_op(fr)) || chan_deop(fr)) || /* +d */
         if (((glob_deop(fr) && !chan_op(fr)) || chan_deop(fr)) || /* +d */
            ((!channel_privchan(chan) && !chan_op(fr) && !glob_op(fr)) || /* simply no +o flag. */
            ((!channel_privchan(chan) && !chan_op(fr) && !glob_op(fr)) || /* simply no +o flag. */
@@ -244,7 +244,7 @@ void priority_do(struct chanset_t * chan, bool opsonly, int action)
       struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0 };
       struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0 };
 
 
       if (m->user)
       if (m->user)
-        get_user_flagrec(m->user, &fr, chan->dname);
+        get_user_flagrec(m->user, &fr, chan->dname, chan);
  
  
       if (((glob_deop(fr) && !chan_op(fr)) || chan_deop(fr)) ||
       if (((glob_deop(fr) && !chan_op(fr)) || chan_deop(fr)) ||
           ((!channel_privchan(chan) && !chan_op(fr) && !glob_op(fr)) ||
           ((!channel_privchan(chan) && !chan_op(fr) && !glob_op(fr)) ||
@@ -287,7 +287,7 @@ void priority_do(struct chanset_t * chan, bool opsonly, int action)
       struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0 };
       struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0 };
 
 
       if (m->user)
       if (m->user)
-        get_user_flagrec(m->user, &fr, chan->dname);
+        get_user_flagrec(m->user, &fr, chan->dname, chan);
 
 
       if (((glob_deop(fr) && !chan_op(fr)) || chan_deop(fr)) ||
       if (((glob_deop(fr) && !chan_op(fr)) || chan_deop(fr)) ||
           ((!channel_privchan(chan) && !chan_op(fr) && !glob_op(fr)) || 
           ((!channel_privchan(chan) && !chan_op(fr) && !glob_op(fr)) || 
@@ -416,7 +416,7 @@ static bool detect_chan_flood(char *floodnick, char *floodhost, char *from,
 
 
   struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0 };
   struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0 };
 
 
-  get_user_flagrec(get_user_by_host(from), &fr, chan->dname);
+  get_user_flagrec(get_user_by_host(from), &fr, chan->dname, chan);
   if (glob_bot(fr) ||
   if (glob_bot(fr) ||
       ((which == FLOOD_DEOP) &&
       ((which == FLOOD_DEOP) &&
        (glob_master(fr) || chan_master(fr))) ||
        (glob_master(fr) || chan_master(fr))) ||
@@ -635,7 +635,7 @@ static void kick_all(struct chanset_t *chan, char *hostmask, const char *comment
 
 
   for (memberlist *m = chan->channel.member; m && m->nick[0]; m = m->next) {
   for (memberlist *m = chan->channel.member; m && m->nick[0]; m = m->next) {
     simple_sprintf(s, "%s!%s", m->nick, m->userhost);
     simple_sprintf(s, "%s!%s", m->nick, m->userhost);
-    get_user_flagrec(m->user, &fr, chan->dname);
+    get_user_flagrec(m->user, &fr, chan->dname, chan);
     if ((wild_match(hostmask, s) || match_cidr(hostmask, s)) && 
     if ((wild_match(hostmask, s) || match_cidr(hostmask, s)) && 
         !chan_sentkick(m) &&
         !chan_sentkick(m) &&
 	!match_my_nick(m->nick) && !chan_issplit(m) &&
 	!match_my_nick(m->nick) && !chan_issplit(m) &&
@@ -663,7 +663,7 @@ static void refresh_ban_kick(struct chanset_t* chan, memberlist *m, char *user)
   if (!m || chan_sentkick(m))
   if (!m || chan_sentkick(m))
     return;
     return;
   struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0 };
   struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0 };
-  get_user_flagrec(m->user, &fr, chan->dname);
+  get_user_flagrec(m->user, &fr, chan->dname, chan);
 
 
   /* Check global bans in first cycle and channel bans
   /* Check global bans in first cycle and channel bans
      in second cycle. */
      in second cycle. */
@@ -1053,7 +1053,7 @@ void check_this_user(char *hand, int del, char *host)
       if ((u && !egg_strcasecmp(u->handle, hand) && del < 2) ||
       if ((u && !egg_strcasecmp(u->handle, hand) && del < 2) ||
 	  (!u && del == 2 && wild_match(host, s))) {
 	  (!u && del == 2 && wild_match(host, s))) {
 	u = del ? NULL : u;
 	u = del ? NULL : u;
-	get_user_flagrec(u, &fr, chan->dname);
+	get_user_flagrec(u, &fr, chan->dname, chan);
 	check_this_member(chan, m->nick, &fr);
 	check_this_member(chan, m->nick, &fr);
       }
       }
     }
     }
@@ -1308,7 +1308,7 @@ void recheck_channel(struct chanset_t *chan, int dobans)
              m->user = get_user_by_host(s);
              m->user = get_user_by_host(s);
            }
            }
     }
     }
-    get_user_flagrec(m->user, &fr, chan->dname);
+    get_user_flagrec(m->user, &fr, chan->dname, chan);
     if (glob_bot(fr) && chan_hasop(m) && !match_my_nick(m->nick))
     if (glob_bot(fr) && chan_hasop(m) && !match_my_nick(m->nick))
       stop_reset = 1;
       stop_reset = 1;
     check_this_member(chan, m->nick, &fr);
     check_this_member(chan, m->nick, &fr);
@@ -1694,7 +1694,7 @@ static int got352or4(struct chanset_t *chan, char *user, char *host, char *nick,
       resolve_to_member(chan, nick, host);
       resolve_to_member(chan, nick, host);
   }
   }
 
 
-  get_user_flagrec(m->user, &fr, chan->dname);
+  get_user_flagrec(m->user, &fr, chan->dname, chan);
   
   
   if (me_op(chan)) {
   if (me_op(chan)) {
     /* are they a chanop, and me too */
     /* are they a chanop, and me too */
@@ -2431,7 +2431,7 @@ static int gotjoin(char *from, char *chname)
       if (me_op(chan)) {
       if (me_op(chan)) {
         struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0 };
         struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0 };
 
 
-        get_user_flagrec(m->user, &fr, chan->dname);
+        get_user_flagrec(m->user, &fr, chan->dname, chan);
 
 
         bool is_op = chk_op(fr, chan);
         bool is_op = chk_op(fr, chan);
 
 
@@ -2619,7 +2619,7 @@ static int gotkick(char *from, char *origmsg)
     if (m)
     if (m)
       m->last = now;
       m->last = now;
     /* This _needs_ to use chan->dname <cybah> */
     /* This _needs_ to use chan->dname <cybah> */
-    get_user_flagrec(u, &fr, chan->dname);
+    get_user_flagrec(u, &fr, chan->dname, chan);
     set_handle_laston(chan->dname, u, now);
     set_handle_laston(chan->dname, u, now);
  
  
     chan = findchan(chname);
     chan = findchan(chname);
@@ -2715,7 +2715,7 @@ static int gotnick(char *from, char *msg)
 
 
       /* nick-ban or nick is +k or something? */
       /* nick-ban or nick is +k or something? */
       if (!chan_stopcheck(m)) {
       if (!chan_stopcheck(m)) {
-	get_user_flagrec(m->user, &fr, chan->dname);
+	get_user_flagrec(m->user, &fr, chan->dname, chan);
 	check_this_member(chan, m->nick, &fr);
 	check_this_member(chan, m->nick, &fr);
       }
       }
     }
     }
@@ -2874,7 +2874,7 @@ static int gotmsg(char *from, char *msg)
   /* Only check if flood-ctcp is active */
   /* Only check if flood-ctcp is active */
   if (flood_ctcp.count && detect_avalanche(msg)) {
   if (flood_ctcp.count && detect_avalanche(msg)) {
     u = get_user_by_host(from);
     u = get_user_by_host(from);
-    get_user_flagrec(u, &fr, chan->dname);
+    get_user_flagrec(u, &fr, chan->dname, chan);
     /* Discard -- kick user if it was to the channel */
     /* Discard -- kick user if it was to the channel */
     if (m && me_op(chan) && 
     if (m && me_op(chan) && 
 	!chan_sentkick(m) &&
 	!chan_sentkick(m) &&
@@ -3032,7 +3032,7 @@ static int gotnotice(char *from, char *msg)
   if (flood_ctcp.count && detect_avalanche(msg)) {
   if (flood_ctcp.count && detect_avalanche(msg)) {
     memberlist *m = ismember(chan, nick);
     memberlist *m = ismember(chan, nick);
 
 
-    get_user_flagrec(u, &fr, chan->dname);
+    get_user_flagrec(u, &fr, chan->dname, chan);
     /* Discard -- kick user if it was to the channel */
     /* Discard -- kick user if it was to the channel */
     if (me_op(chan) && m && !chan_sentkick(m) &&
     if (me_op(chan) && m && !chan_sentkick(m) &&
 	!(use_exempts && ban_fun &&
 	!(use_exempts && ban_fun &&

+ 10 - 10
src/mod/irc.mod/irc.c

@@ -92,7 +92,7 @@ detect_offense(memberlist* m, struct chanset_t *chan, char *msg)
 
 
   //size_t tot = strlen(msg);
   //size_t tot = strlen(msg);
 
 
-  get_user_flagrec(u, &fr, chan->dname);
+  get_user_flagrec(u, &fr, chan->dname, chan);
 
 
   for (; *msg; ++msg) {
   for (; *msg; ++msg) {
     if (egg_isupper(*msg))
     if (egg_isupper(*msg))
@@ -553,7 +553,7 @@ getin_request(char *botnick, char *code, char *par)
       return;
       return;
     }
     }
 
 
-    get_user_flagrec(u, &fr, chan->dname);
+    get_user_flagrec(u, &fr, chan->dname, chan);
 
 
     if (!chk_op(fr, chan)) {
     if (!chk_op(fr, chan)) {
       putlog(LOG_GETIN, "*", "opreq from %s/%s on %s - %s doesnt have +o for chan.", botnick, nick, chan->dname, botnick);
       putlog(LOG_GETIN, "*", "opreq from %s/%s on %s - %s doesnt have +o for chan.", botnick, nick, chan->dname, botnick);
@@ -586,7 +586,7 @@ getin_request(char *botnick, char *code, char *par)
       return;
       return;
     }
     }
 #endif
 #endif
-    get_user_flagrec(u, &fr, chan->dname);
+    get_user_flagrec(u, &fr, chan->dname, chan);
 
 
     if (!chk_op(fr, chan) || chan_kick(fr) || glob_kick(fr)) {
     if (!chk_op(fr, chan) || chan_kick(fr) || glob_kick(fr)) {
       putlog(LOG_GETIN, "*", "inreq from %s/%s for %s - %s doesn't have acces for chan.", botnick, nick, chan->dname, botnick);
       putlog(LOG_GETIN, "*", "inreq from %s/%s for %s - %s doesn't have acces for chan.", botnick, nick, chan->dname, botnick);
@@ -722,7 +722,7 @@ request_op(struct chanset_t *chan)
 
 
   struct flag_record fr = { FR_GLOBAL | FR_CHAN | FR_BOT, 0, 0, 0 };
   struct flag_record fr = { FR_GLOBAL | FR_CHAN | FR_BOT, 0, 0, 0 };
 
 
-  get_user_flagrec(conf.bot->u, &fr, chan->dname);
+  get_user_flagrec(conf.bot->u, &fr, chan->dname, chan);
 
 
   if (!chk_op(fr, chan) || glob_kick(fr) || chan_kick(fr)) {
   if (!chk_op(fr, chan) || glob_kick(fr) || chan_kick(fr)) {
     putlog(LOG_GETIN, "*", "Not requesting op for %s - I do not have access to that channel.", chan->dname);
     putlog(LOG_GETIN, "*", "Not requesting op for %s - I do not have access to that channel.", chan->dname);
@@ -847,7 +847,7 @@ request_in(struct chanset_t *chan)
     if (bot->hub || !bot->u)
     if (bot->hub || !bot->u)
       continue;
       continue;
 
 
-    get_user_flagrec(bot->u, &fr, chan->dname);
+    get_user_flagrec(bot->u, &fr, chan->dname, chan);
     if (bot_shouldjoin(bot->u, &fr, chan) && chk_op(fr, chan))
     if (bot_shouldjoin(bot->u, &fr, chan) && chk_op(fr, chan))
       botops[foundBots++] = bot->bot;
       botops[foundBots++] = bot->bot;
   }
   }
@@ -891,7 +891,7 @@ want_to_revenge(struct chanset_t *chan, struct userrec *u,
   if (match_my_nick(badnick))
   if (match_my_nick(badnick))
     return 0;
     return 0;
 
 
-  get_user_flagrec(u, &fr, chan->dname);
+  get_user_flagrec(u, &fr, chan->dname, chan);
 
 
   /* Kickee didn't kick themself? */
   /* Kickee didn't kick themself? */
   if (rfc_casecmp(badnick, victimstr)) {
   if (rfc_casecmp(badnick, victimstr)) {
@@ -904,7 +904,7 @@ want_to_revenge(struct chanset_t *chan, struct userrec *u,
     } else if (channel_revenge(chan) && u2) {
     } else if (channel_revenge(chan) && u2) {
       struct flag_record fr2 = { FR_GLOBAL | FR_CHAN, 0, 0, 0 };
       struct flag_record fr2 = { FR_GLOBAL | FR_CHAN, 0, 0, 0 };
 
 
-      get_user_flagrec(u2, &fr2, chan->dname);
+      get_user_flagrec(u2, &fr2, chan->dname, chan);
       /* Protecting friends? */
       /* Protecting friends? */
       /* Protecting ops? */
       /* Protecting ops? */
       if ((channel_protectops(chan) && chk_op(fr2, chan))
       if ((channel_protectops(chan) && chk_op(fr2, chan))
@@ -928,7 +928,7 @@ punish_badguy(struct chanset_t *chan, char *whobad,
   char reason[1024] = "", ct[81] = "", *kick_msg = NULL;
   char reason[1024] = "", ct[81] = "", *kick_msg = NULL;
   struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0 };
   struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0 };
 
 
-  get_user_flagrec(u, &fr, chan->dname);
+  get_user_flagrec(u, &fr, chan->dname, chan);
 
 
   /* Get current time into a string */
   /* Get current time into a string */
   egg_strftime(ct, sizeof ct, "%d %b %Z", gmtime(&now));
   egg_strftime(ct, sizeof ct, "%d %b %Z", gmtime(&now));
@@ -1451,7 +1451,7 @@ check_expired_chanstuff(struct chanset_t *chan)
             }
             }
 
 
             if (m->user) {
             if (m->user) {
-              get_user_flagrec(m->user, &fr, chan->dname);
+              get_user_flagrec(m->user, &fr, chan->dname, chan);
               if (!glob_bot(fr)) {
               if (!glob_bot(fr)) {
                 if (!(m->flags & EVOICE) && 
                 if (!(m->flags & EVOICE) && 
                     (
                     (
@@ -1557,7 +1557,7 @@ irc_report(int idx, int details)
   strcpy(q, "Channels: ");
   strcpy(q, "Channels: ");
   for (struct chanset_t *chan = chanset; chan; chan = chan->next) {
   for (struct chanset_t *chan = chanset; chan; chan = chan->next) {
     if (idx != DP_STDOUT)
     if (idx != DP_STDOUT)
-      get_user_flagrec(dcc[idx].user, &fr, chan->dname);
+      get_user_flagrec(dcc[idx].user, &fr, chan->dname, chan);
 
 
     if (!privchan(fr, chan, PRIV_OP) && (idx == DP_STDOUT || glob_master(fr) || chan_master(fr))) {
     if (!privchan(fr, chan, PRIV_OP) && (idx == DP_STDOUT || glob_master(fr) || chan_master(fr))) {
       p = NULL;
       p = NULL;

+ 4 - 4
src/mod/irc.mod/mode.c

@@ -547,7 +547,7 @@ got_op(struct chanset_t *chan, memberlist *m, memberlist *mv)
     meop = 1;
     meop = 1;
   }
   }
 
 
-  get_user_flagrec(mv->user, &victim, chan->dname);
+  get_user_flagrec(mv->user, &victim, chan->dname, chan);
   /* Flags need to be set correctly right from the beginning now, so that
   /* Flags need to be set correctly right from the beginning now, so that
    * add_mode() doesn't get irritated.
    * add_mode() doesn't get irritated.
    */
    */
@@ -627,7 +627,7 @@ got_deop(struct chanset_t *chan, memberlist *m, memberlist *mv, char *isserver)
   if (m)
   if (m)
     simple_sprintf(s1, "%s!%s", m->nick, m->userhost);
     simple_sprintf(s1, "%s!%s", m->nick, m->userhost);
 
 
-  get_user_flagrec(mv->user, &victim, chan->dname);
+  get_user_flagrec(mv->user, &victim, chan->dname, chan);
 
 
   /* Flags need to be set correctly right from the beginning now, so that
   /* Flags need to be set correctly right from the beginning now, so that
    * add_mode() doesn't get irritated.
    * add_mode() doesn't get irritated.
@@ -717,7 +717,7 @@ got_ban(struct chanset_t *chan, memberlist *m, char *mask, char *isserver)
       if ((wild_match(mask, s1) || match_cidr(mask, s1))
       if ((wild_match(mask, s1) || match_cidr(mask, s1))
           && !isexempted(chan, s1)) {
           && !isexempted(chan, s1)) {
         if (m2->user || (!m2->user && (m2->user = get_user_by_host(s1)))) {
         if (m2->user || (!m2->user && (m2->user = get_user_by_host(s1)))) {
-          get_user_flagrec(m2->user, &victim, chan->dname);
+          get_user_flagrec(m2->user, &victim, chan->dname, chan);
           if (!(glob_kick(victim) || chan_kick(victim)) && 
           if (!(glob_kick(victim) || chan_kick(victim)) && 
               (((chk_op(victim, chan) && !chan_master(user) && !glob_master(user) && !glob_bot(user)) || 
               (((chk_op(victim, chan) && !chan_master(user) && !glob_master(user) && !glob_bot(user)) || 
               (m2->user->bot && findbot(m2->user->handle))) && !isexempted(chan, s1))) {
               (m2->user->bot && findbot(m2->user->handle))) && !isexempted(chan, s1))) {
@@ -1392,7 +1392,7 @@ gotmode(char *from, char *msg)
             if (mv) {
             if (mv) {
               bool dv = 0;
               bool dv = 0;
 
 
-              get_user_flagrec(mv->user, &victim, chan->dname);
+              get_user_flagrec(mv->user, &victim, chan->dname, chan);
 
 
               if (msign == '+') {
               if (msign == '+') {
                 if (mv->flags & EVOICE) {
                 if (mv->flags & EVOICE) {

+ 13 - 13
src/mod/irc.mod/msgcmds.c

@@ -31,7 +31,7 @@ static int msg_bewm(char *nick, char *host, struct userrec *u, char *par)
 
 
   struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0 };
   struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0 };
 
 
-  get_user_flagrec(u, &fr, chan->dname);
+  get_user_flagrec(u, &fr, chan->dname, chan);
 
 
   if (!chk_op(fr, chan))  {
   if (!chk_op(fr, chan))  {
     putlog(LOG_CMDS, "*", "(%s!%s) !%s! !BEWM", nick, host, u->handle);
     putlog(LOG_CMDS, "*", "(%s!%s) !%s! !BEWM", nick, host, u->handle);
@@ -130,7 +130,7 @@ static int msg_op(char *nick, char *host, struct userrec *u, char *par)
       if (par[0]) {
       if (par[0]) {
         chan = findchan_by_dname(par);
         chan = findchan_by_dname(par);
         if (chan && channel_active(chan)) {
         if (chan && channel_active(chan)) {
-          get_user_flagrec(u, &fr, par);
+          get_user_flagrec(u, &fr, par, chan);
           if (chk_op(fr, chan)) {
           if (chk_op(fr, chan)) {
             if (do_op(nick, chan, 0, 1)) {
             if (do_op(nick, chan, 0, 1)) {
               stats_add(u, 0, 1);
               stats_add(u, 0, 1);
@@ -144,7 +144,7 @@ static int msg_op(char *nick, char *host, struct userrec *u, char *par)
       } else {
       } else {
         int stats = 0;
         int stats = 0;
         for (chan = chanset; chan; chan = chan->next) {
         for (chan = chanset; chan; chan = chan->next) {
-          get_user_flagrec(u, &fr, chan->dname);
+          get_user_flagrec(u, &fr, chan->dname, chan);
           if (chk_op(fr, chan)) {
           if (chk_op(fr, chan)) {
             if (do_op(nick, chan, 0, 1)) {
             if (do_op(nick, chan, 0, 1)) {
               stats++;
               stats++;
@@ -220,7 +220,7 @@ static int msg_invite(char *nick, char *host, struct userrec *u, char *par)
   if (u_pass_match(u, pass) && !u_pass_match(u, "-")) {
   if (u_pass_match(u, pass) && !u_pass_match(u, "-")) {
     if (par[0] == '*') {
     if (par[0] == '*') {
       for (chan = chanset; chan; chan = chan->next) {
       for (chan = chanset; chan; chan = chan->next) {
-	get_user_flagrec(u, &fr, chan->dname);
+	get_user_flagrec(u, &fr, chan->dname, chan);
         if (chk_op(fr, chan) && (chan->channel.mode & CHANINV)) {
         if (chk_op(fr, chan) && (chan->channel.mode & CHANINV)) {
           cache_invite(chan, nick, host, u->handle, 0, 0);
           cache_invite(chan, nick, host, u->handle, 0, 0);
         }
         }
@@ -237,7 +237,7 @@ static int msg_invite(char *nick, char *host, struct userrec *u, char *par)
       return BIND_RET_BREAK;
       return BIND_RET_BREAK;
     }
     }
     /* We need to check access here also (dw 991002) */
     /* We need to check access here also (dw 991002) */
-    get_user_flagrec(u, &fr, par);
+    get_user_flagrec(u, &fr, par, chan);
     if (chk_op(fr, chan)) {
     if (chk_op(fr, chan)) {
       cache_invite(chan, nick, host, u->handle, 0, 0);
       cache_invite(chan, nick, host, u->handle, 0, 0);
       putlog(LOG_CMDS, "*", "(%s!%s) !%s! INVITE %s", nick, host, u->handle, par);
       putlog(LOG_CMDS, "*", "(%s!%s) !%s! INVITE %s", nick, host, u->handle, par);
@@ -519,7 +519,7 @@ static int msgc_op(Auth *a, char *chname, char *par)
     if (!chan)
     if (!chan)
       chan = findchan_by_dname(par);
       chan = findchan_by_dname(par);
     if (chan && channel_active(chan)) {
     if (chan && channel_active(chan)) {
-      get_user_flagrec(a->user, &fr, chan->dname);
+      get_user_flagrec(a->user, &fr, chan->dname, chan);
       if (chk_op(fr, chan)) {
       if (chk_op(fr, chan)) {
         if (do_op(a->nick, chan, 0, force))
         if (do_op(a->nick, chan, 0, force))
           stats_add(a->user, 0, 1);
           stats_add(a->user, 0, 1);
@@ -528,7 +528,7 @@ static int msgc_op(Auth *a, char *chname, char *par)
     }
     }
   } else {
   } else {
     for (chan = chanset; chan; chan = chan->next) {
     for (chan = chanset; chan; chan = chan->next) {
-      get_user_flagrec(a->user, &fr, chan->dname);
+      get_user_flagrec(a->user, &fr, chan->dname, chan);
       if (chk_op(fr, chan)) {
       if (chk_op(fr, chan)) {
        if (do_op(a->nick, chan, 0, force))
        if (do_op(a->nick, chan, 0, force))
          stats_add(a->user, 0, 1);
          stats_add(a->user, 0, 1);
@@ -568,7 +568,7 @@ static int msgc_voice(Auth *a, char *chname, char *par)
     if (!chan)
     if (!chan)
       chan = findchan_by_dname(par);
       chan = findchan_by_dname(par);
     if (chan && channel_active(chan)) {
     if (chan && channel_active(chan)) {
-      get_user_flagrec(a->user, &fr, chan->dname);
+      get_user_flagrec(a->user, &fr, chan->dname, chan);
       if (!chk_devoice(fr)) {		/* dont voice +q */
       if (!chk_devoice(fr)) {		/* dont voice +q */
         add_mode(chan, '+', 'v', a->nick);
         add_mode(chan, '+', 'v', a->nick);
       }
       }
@@ -576,7 +576,7 @@ static int msgc_voice(Auth *a, char *chname, char *par)
     }
     }
   } else {
   } else {
     for (chan = chanset; chan; chan = chan->next) {
     for (chan = chanset; chan; chan = chan->next) {
-      get_user_flagrec(a->user, &fr, chan->dname);
+      get_user_flagrec(a->user, &fr, chan->dname, chan);
       if (!chk_devoice(fr)) {		/* dont voice +q */
       if (!chk_devoice(fr)) {		/* dont voice +q */
         add_mode(chan, '+', 'v', a->nick);
         add_mode(chan, '+', 'v', a->nick);
       }
       }
@@ -593,7 +593,7 @@ static int msgc_channels(Auth *a, char *chname, char *par)
 
 
   LOGC("CHANNELS");
   LOGC("CHANNELS");
   for (chan = chanset; chan; chan = chan->next) {
   for (chan = chanset; chan; chan = chan->next) {
-    get_user_flagrec(a->user, &fr, chan->dname);
+    get_user_flagrec(a->user, &fr, chan->dname, chan);
     if (chk_op(fr, chan)) {
     if (chk_op(fr, chan)) {
       if (me_op(chan)) 
       if (me_op(chan)) 
         strcat(list, "@");
         strcat(list, "@");
@@ -624,7 +624,7 @@ static int msgc_getkey(Auth *a, char *chname, char *par)
   LOGC("GETKEY");
   LOGC("GETKEY");
   chan = findchan_by_dname(par);
   chan = findchan_by_dname(par);
   if (chan && channel_active(chan) && !channel_pending(chan)) {
   if (chan && channel_active(chan) && !channel_pending(chan)) {
-    get_user_flagrec(a->user, &fr, chan->dname);
+    get_user_flagrec(a->user, &fr, chan->dname, chan);
     if (chk_op(fr, chan)) {
     if (chk_op(fr, chan)) {
       if (chan->channel.key[0]) {
       if (chan->channel.key[0]) {
         reply(a->nick, NULL, "Key for %s is: %s\n", chan->name, chan->channel.key);
         reply(a->nick, NULL, "Key for %s is: %s\n", chan->name, chan->channel.key);
@@ -712,7 +712,7 @@ static int msgc_invite(Auth *a, char *chname, char *par)
     chan = findchan_by_dname(par);
     chan = findchan_by_dname(par);
     if (chan && channel_active(chan) && !ismember(chan, a->nick)) {
     if (chan && channel_active(chan) && !ismember(chan, a->nick)) {
       if ((!(chan->channel.mode & CHANINV) && force) || (chan->channel.mode & CHANINV)) {
       if ((!(chan->channel.mode & CHANINV) && force) || (chan->channel.mode & CHANINV)) {
-        get_user_flagrec(a->user, &fr, chan->dname);
+        get_user_flagrec(a->user, &fr, chan->dname, chan);
         if (chk_op(fr, chan)) {
         if (chk_op(fr, chan)) {
           cache_invite(chan, a->nick, a->host, a->handle, 0, 0);
           cache_invite(chan, a->nick, a->host, a->handle, 0, 0);
         }
         }
@@ -723,7 +723,7 @@ static int msgc_invite(Auth *a, char *chname, char *par)
     for (chan = chanset; chan; chan = chan->next) {
     for (chan = chanset; chan; chan = chan->next) {
       if (channel_active(chan) && !ismember(chan, a->nick)) {
       if (channel_active(chan) && !ismember(chan, a->nick)) {
         if ((!(chan->channel.mode & CHANINV) && force) || (chan->channel.mode & CHANINV)) {
         if ((!(chan->channel.mode & CHANINV) && force) || (chan->channel.mode & CHANINV)) {
-          get_user_flagrec(a->user, &fr, chan->dname);
+          get_user_flagrec(a->user, &fr, chan->dname, chan);
           if (chk_op(fr, chan)) {
           if (chk_op(fr, chan)) {
             cache_invite(chan, a->nick, a->host, a->handle, 0, 0);
             cache_invite(chan, a->nick, a->host, a->handle, 0, 0);
           }
           }

+ 2 - 2
src/mod/server.mod/server.c

@@ -839,7 +839,7 @@ static int ctcp_DCC_CHAT(char *nick, char *from, struct userrec *u, char *object
   bool ok = 1;
   bool ok = 1;
   struct flag_record fr = {FR_GLOBAL | FR_CHAN | FR_ANYWH, 0, 0, 0 };
   struct flag_record fr = {FR_GLOBAL | FR_CHAN | FR_ANYWH, 0, 0, 0 };
 
 
-  get_user_flagrec(u, &fr, 0);
+  get_user_flagrec(u, &fr, NULL);
 
 
   if (ischanhub() && !glob_chuba(fr))
   if (ischanhub() && !glob_chuba(fr))
    ok = 0;
    ok = 0;
@@ -905,7 +905,7 @@ static void dcc_chat_hostresolved(int i)
 #endif /* HAVE_SSL */
 #endif /* HAVE_SSL */
 
 
     dcc[i].status = STAT_ECHO;
     dcc[i].status = STAT_ECHO;
-    get_user_flagrec(dcc[i].user, &fr, 0);
+    get_user_flagrec(dcc[i].user, &fr, NULL);
     if (ischanhub() && !glob_chuba(fr))
     if (ischanhub() && !glob_chuba(fr))
      ok = 0;
      ok = 0;
     if (ok)
     if (ok)

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

@@ -1224,7 +1224,7 @@ hide_chans(const char *nick, struct userrec *u, char *_channels, bool publicOnly
     chan = findchan_by_dname(chname);
     chan = findchan_by_dname(chname);
 
 
     if (chan && !publicOnly)
     if (chan && !publicOnly)
-     get_user_flagrec(u, &fr, chan->dname);
+     get_user_flagrec(u, &fr, chan->dname, chan);
 
 
     if (!chan || 
     if (!chan ||