Parcourir la source

* +autoop
* +O (autoop)
* Fixed various bugs in flags.c


svn: 970

Bryan Drewery il y a 22 ans
Parent
commit
2cd59ef8ec

+ 2 - 0
doc/UPDATES

@@ -24,6 +24,8 @@ This is a summary of ChangeLog basically.
 19.Limits were not being set.
 19.Limits were not being set.
 20.No longer chmodding on CYGWIN
 20.No longer chmodding on CYGWIN
 21.The AES core should be slightly faster now.
 21.The AES core should be slightly faster now.
+22.Added channel flag +autoop (users only, +private accounted for).
+23.Added user flag for autoop (+O).
 
 
 1.1.5
 1.1.5
 
 

+ 4 - 2
src/chan.h

@@ -145,8 +145,8 @@ struct chanset_t {
   int flood_ctcp_time;
   int flood_ctcp_time;
   int flood_nick_thr;
   int flood_nick_thr;
   int flood_nick_time;
   int flood_nick_time;
-  int status;
-  int ircnet_status;
+  uint32_t status;
+  uint32_t ircnet_status;
   int limitraise;
   int limitraise;
   int closed_ban;
   int closed_ban;
   int closed_private;
   int closed_private;
@@ -218,6 +218,7 @@ struct chanset_t {
 #define CHAN_ASKEDMODES     BIT22	/* find out key-info on IRCu          */
 #define CHAN_ASKEDMODES     BIT22	/* find out key-info on IRCu          */
 #define CHAN_JUPED          BIT23	/* Is channel juped                   */
 #define CHAN_JUPED          BIT23	/* Is channel juped                   */
 #define CHAN_STOP_CYCLE     BIT24	/* Some efnetservers have defined NO_CHANOPS_WHEN_SPLIT */
 #define CHAN_STOP_CYCLE     BIT24	/* Some efnetservers have defined NO_CHANOPS_WHEN_SPLIT */
+#define CHAN_AUTOOP         BIT25
 
 
 #define CHAN_ASKED_EXEMPTS  BIT0
 #define CHAN_ASKED_EXEMPTS  BIT0
 #define CHAN_ASKED_INVITED  BIT1
 #define CHAN_ASKED_INVITED  BIT1
@@ -263,6 +264,7 @@ struct chanset_t *findchan_by_dname(const char *name);
 #define channel_voice(chan) (chan->status & CHAN_VOICE)
 #define channel_voice(chan) (chan->status & CHAN_VOICE)
 #define channel_fastop(chan) (chan->status & CHAN_FASTOP)
 #define channel_fastop(chan) (chan->status & CHAN_FASTOP)
 #define channel_private(chan) (chan->status & CHAN_PRIVATE)
 #define channel_private(chan) (chan->status & CHAN_PRIVATE)
+#define channel_autoop(chan) (chan->status & CHAN_AUTOOP)
 /* Chanflag template
 /* Chanflag template
  *#define channel_temp(chan) (chan->status & CHAN_PRIVATE)
  *#define channel_temp(chan) (chan->status & CHAN_PRIVATE)
  */
  */

+ 24 - 7
src/flags.c

@@ -34,9 +34,8 @@ void init_flags()
 
 
 /* Some flags are mutually exclusive -- this roots them out
 /* Some flags are mutually exclusive -- this roots them out
  */
  */
-int sanity_check(flag_t atr)
+flag_t sanity_check(flag_t atr)
 {
 {
-/* bots shouldnt have +pmcnaijlys */
   if ((atr & USER_BOT) &&
   if ((atr & USER_BOT) &&
       (atr & (USER_PARTY | USER_MASTER | USER_OWNER | USER_ADMIN | USER_HUBA | USER_CHUBA)))
       (atr & (USER_PARTY | USER_MASTER | USER_OWNER | USER_ADMIN | USER_HUBA | USER_CHUBA)))
     atr &= ~(USER_PARTY | USER_MASTER | USER_OWNER | USER_ADMIN | USER_HUBA | USER_CHUBA);
     atr &= ~(USER_PARTY | USER_MASTER | USER_OWNER | USER_ADMIN | USER_HUBA | USER_CHUBA);
@@ -46,6 +45,8 @@ int sanity_check(flag_t atr)
     atr &= ~(USER_DOLIMIT | USER_DOVOICE | USER_UPDATEHUB | USER_CHANHUB);
     atr &= ~(USER_DOLIMIT | USER_DOVOICE | USER_UPDATEHUB | USER_CHANHUB);
   if ((atr & USER_OP) && (atr & USER_DEOP))
   if ((atr & USER_OP) && (atr & USER_DEOP))
     atr &= ~(USER_OP | USER_DEOP);
     atr &= ~(USER_OP | USER_DEOP);
+  if ((atr & USER_AUTOOP) && (atr & USER_DEOP))
+    atr &= ~(USER_AUTOOP | USER_DEOP);
   if ((atr & USER_VOICE) && (atr & USER_QUIET))
   if ((atr & USER_VOICE) && (atr & USER_QUIET))
     atr &= ~(USER_VOICE | USER_QUIET);
     atr &= ~(USER_VOICE | USER_QUIET);
  
  
@@ -70,13 +71,15 @@ int sanity_check(flag_t atr)
 
 
 /* Sanity check on channel attributes
 /* Sanity check on channel attributes
  */
  */
-int chan_sanity_check(int chatr, int atr)
+flag_t chan_sanity_check(flag_t chatr, flag_t atr)
 {
 {
   /* admin for chan does shit.. */
   /* admin for chan does shit.. */
   if (chatr & USER_ADMIN)
   if (chatr & USER_ADMIN)
     chatr &= ~(USER_ADMIN);
     chatr &= ~(USER_ADMIN);
   if ((chatr & USER_OP) && (chatr & USER_DEOP))
   if ((chatr & USER_OP) && (chatr & USER_DEOP))
     chatr &= ~(USER_OP | USER_DEOP);
     chatr &= ~(USER_OP | USER_DEOP);
+  if ((chatr & USER_AUTOOP) && (chatr & USER_DEOP))
+    chatr &= ~(USER_AUTOOP | USER_DEOP);
   if ((chatr & USER_VOICE) && (chatr & USER_QUIET))
   if ((chatr & USER_VOICE) && (chatr & USER_QUIET))
     chatr &= ~(USER_VOICE | USER_QUIET);
     chatr &= ~(USER_VOICE | USER_QUIET);
   /* Can't be channel owner without also being channel master */
   /* Can't be channel owner without also being channel master */
@@ -156,26 +159,31 @@ void break_down_flags(const char *string, struct flag_record *plus, struct flag_
         chan = 1;
         chan = 1;
       break;		/* switch() */
       break;		/* switch() */
     default:
     default:
-      if ((*string >= 'a') && (*string <= 'z')) {
+     {
+      flag_t flagbit = FLAG[(unsigned char) *string];
+
+      if (flagbit) {
 	switch (chan) {
 	switch (chan) {
 	case 0:
 	case 0:
 	  /* which->global |= (flag_t) 1 << (*string - 'a'); */
 	  /* which->global |= (flag_t) 1 << (*string - 'a'); */
-          which->global |= FLAG[(unsigned char) *string];
+          which->global |= flagbit;
 	  break;
 	  break;
 	case 1:
 	case 1:
 	  /* which->chan |= (flag_t) 1 << (*string - 'a'); */
 	  /* which->chan |= (flag_t) 1 << (*string - 'a'); */
-          which->chan |= FLAG[(unsigned char) *string];
+          which->chan |= flagbit;
 	  break;
 	  break;
 	}
 	}
       } 
       } 
+     }
     }
     }
     string++;
     string++;
   }
   }
+  /*
   for (which = plus; which; which = (which == plus ? minus : 0)) {
   for (which = plus; which; which = (which == plus ? minus : 0)) {
     which->global &= USER_VALID;
     which->global &= USER_VALID;
-
     which->chan &= CHAN_VALID;
     which->chan &= CHAN_VALID;
   }
   }
+  */
   plus->match |= flags;
   plus->match |= flags;
   if (minus) {
   if (minus) {
     minus->match |= flags;
     minus->match |= flags;
@@ -399,6 +407,15 @@ int chk_op(struct flag_record fr, struct chanset_t *chan)
   return 0;
   return 0;
 }
 }
 
 
+int chk_autoop(struct flag_record fr, struct chanset_t *chan)
+{
+  if (!chan || (!private(fr, chan, PRIV_OP) && chk_op(fr, chan) && !chk_deop(fr, chan))) {
+    if (channel_autoop(chan) || chan_autoop(fr) || glob_autoop(fr))
+      return 1;
+  }
+  return 0;
+}
+
 int chk_deop(struct flag_record fr, struct chanset_t *chan)
 int chk_deop(struct flag_record fr, struct chanset_t *chan)
 {
 {
   if (chan_deop(fr) || (glob_deop(fr) && !chan_op(fr)))
   if (chan_deop(fr) || (glob_deop(fr) && !chan_op(fr)))

+ 8 - 7
src/flags.h

@@ -28,7 +28,6 @@ struct flag_record {
 #define FR_ANYWH  0x10000000
 #define FR_ANYWH  0x10000000
 #define FR_AND    0x20000000
 #define FR_AND    0x20000000
 #define FR_OR     0x40000000
 #define FR_OR     0x40000000
-#define FR_ALL    0x0fffffff
 
 
 /*
 /*
  * userflags:
  * userflags:
@@ -59,9 +58,8 @@ struct flag_record {
 #define DEFLAG_MDOP        6
 #define DEFLAG_MDOP        6
 #define DEFLAG_MOP	   7
 #define DEFLAG_MOP	   7
 
 
-#define USER_VALID 0x03ffffff	/* all USER_ flags in use              */
-#define CHAN_VALID 0x03ffffff	/* all flags that can be chan specific */
-#define BOT_VALID  0x7fe689C1 /* all BOT_ flags in use               */
+#define USER_VALID (flag_t) 0xfffffffffffff
+#define CHAN_VALID (flag_t) 0xfffffffffffff
 
 
 #define USER_ADMIN	FLAG['a']
 #define USER_ADMIN	FLAG['a']
 #define USER_BOT	FLAG['b']
 #define USER_BOT	FLAG['b']
@@ -75,6 +73,7 @@ struct flag_record {
 #define USER_MASTER	FLAG['m']
 #define USER_MASTER	FLAG['m']
 #define USER_OWNER	FLAG['n']
 #define USER_OWNER	FLAG['n']
 #define USER_OP		FLAG['o']
 #define USER_OP		FLAG['o']
+#define USER_AUTOOP	FLAG['O']
 #define USER_PARTY	FLAG['p']
 #define USER_PARTY	FLAG['p']
 #define USER_QUIET	FLAG['q']
 #define USER_QUIET	FLAG['q']
 #define USER_UPDATEHUB	FLAG['u']
 #define USER_UPDATEHUB	FLAG['u']
@@ -85,7 +84,6 @@ struct flag_record {
 #define USER_DEFAULT	0
 #define USER_DEFAULT	0
 
 
 
 
-
 #define bot_hublevel(x) ( ( (x) && (x->flags & USER_BOT) && (get_user(&USERENTRY_BOTADDR, x)) ) ? \
 #define bot_hublevel(x) ( ( (x) && (x->flags & USER_BOT) && (get_user(&USERENTRY_BOTADDR, x)) ) ? \
                           ( ((struct bot_addr *) get_user(&USERENTRY_BOTADDR, x))->hublevel ? \
                           ( ((struct bot_addr *) get_user(&USERENTRY_BOTADDR, x))->hublevel ? \
                             ((struct bot_addr *) get_user(&USERENTRY_BOTADDR, x))->hublevel : 999) \
                             ((struct bot_addr *) get_user(&USERENTRY_BOTADDR, x))->hublevel : 999) \
@@ -95,6 +93,8 @@ struct flag_record {
  */
  */
 #define chan_op(x)                     ((x).chan & USER_OP)
 #define chan_op(x)                     ((x).chan & USER_OP)
 #define glob_op(x)                     ((x).global & USER_OP)
 #define glob_op(x)                     ((x).global & USER_OP)
+#define chan_autoop(x)                 ((x).chan & USER_AUTOOP)
+#define glob_autoop(x)                 ((x).global & USER_AUTOOP)
 #define chan_deop(x)                   ((x).chan & USER_DEOP)
 #define chan_deop(x)                   ((x).chan & USER_DEOP)
 #define glob_deop(x)                   ((x).global & USER_DEOP)
 #define glob_deop(x)                   ((x).global & USER_DEOP)
 #define glob_master(x)                 ((x).global & USER_MASTER)
 #define glob_master(x)                 ((x).global & USER_MASTER)
@@ -132,12 +132,13 @@ 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 *);
 int flagrec_eq(struct flag_record *, struct flag_record *);
 int flagrec_eq(struct flag_record *, struct flag_record *);
 int flagrec_ok(struct flag_record *, struct flag_record *);
 int flagrec_ok(struct flag_record *, struct flag_record *);
-int sanity_check(flag_t);
-int chan_sanity_check(int, int);
+flag_t sanity_check(flag_t);
+flag_t chan_sanity_check(flag_t, flag_t);
 char geticon(int);
 char geticon(int);
 
 
 int private(struct flag_record, struct chanset_t *, int);
 int private(struct flag_record, struct chanset_t *, int);
 int chk_op(struct flag_record, struct chanset_t *);
 int chk_op(struct flag_record, struct chanset_t *);
+int chk_autoop(struct flag_record, struct chanset_t *);
 int chk_deop(struct flag_record, struct chanset_t *);
 int chk_deop(struct flag_record, struct chanset_t *);
 int chk_voice(struct flag_record, struct chanset_t *);
 int chk_voice(struct flag_record, struct chanset_t *);
 int chk_devoice(struct flag_record, struct chanset_t *);
 int chk_devoice(struct flag_record, struct chanset_t *);

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

@@ -770,6 +770,8 @@ void channels_report(int idx, int details)
           i += my_strcpy(s + i, "manop ");
           i += my_strcpy(s + i, "manop ");
         if (channel_voice(chan))
         if (channel_voice(chan))
           i += my_strcpy(s + i, "voice ");
           i += my_strcpy(s + i, "voice ");
+        if (channel_autoop(chan))
+          i += my_strcpy(s + i, "autoop ");
 /* Chanflag template
 /* Chanflag template
  *	if (channel_temp(chan))
  *	if (channel_temp(chan))
  *	  i += my_strcpy(s + i, "temp ");
  *	  i += my_strcpy(s + i, "temp ");

+ 1 - 0
src/mod/channels.mod/cmdschan.c

@@ -1161,6 +1161,7 @@ static void cmd_chaninfo(struct userrec *u, int idx, char *par)
  */
  */
     dprintf(idx, "Channel flags:\n");
     dprintf(idx, "Channel flags:\n");
     work[0] = 0;
     work[0] = 0;
+    SHOW_FLAG("autoop",		channel_autoop(chan));
     SHOW_FLAG("bitch",		channel_bitch(chan));
     SHOW_FLAG("bitch",		channel_bitch(chan));
     SHOW_FLAG("closed",		channel_closed(chan));
     SHOW_FLAG("closed",		channel_closed(chan));
     SHOW_FLAG("cycle",		channel_cycle(chan));
     SHOW_FLAG("cycle",		channel_cycle(chan));

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

@@ -510,6 +510,10 @@ int channel_modify(char *result, struct chanset_t *chan, int items, char **item)
       chan->status |= CHAN_VOICE;
       chan->status |= CHAN_VOICE;
     else if (!strcmp(item[i], "-voice"))
     else if (!strcmp(item[i], "-voice"))
       chan->status &= ~CHAN_VOICE;
       chan->status &= ~CHAN_VOICE;
+    else if (!strcmp(item[i], "+autoop"))
+      chan->status |= CHAN_AUTOOP;
+    else if (!strcmp(item[i], "-autoop"))
+      chan->status &= ~CHAN_AUTOOP;
 /* Chanflag template
 /* Chanflag template
  *  else if (!strcmp(item[i], "+temp"))
  *  else if (!strcmp(item[i], "+temp"))
  *    chan->status |= CHAN_TEMP;
  *    chan->status |= CHAN_TEMP;

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

@@ -1009,7 +1009,7 @@ flood-nick %d:%d closed-ban %d closed-private %d ban-time %d \
 exempt-time %d invite-time %d %cenforcebans %cdynamicbans %cuserbans \
 exempt-time %d invite-time %d %cenforcebans %cdynamicbans %cuserbans \
 %cbitch %cprotectops %crevenge %crevengebot %cprivate %ccycle \
 %cbitch %cprotectops %crevenge %crevengebot %cprivate %ccycle \
 %cinactive %cdynamicexempts %cuserexempts %cdynamicinvites %cuserinvites \
 %cinactive %cdynamicexempts %cuserexempts %cdynamicinvites %cuserinvites \
-%cnodesynch %cclosed %ctake %cmanop %cvoice %cfastop }\n",
+%cnodesynch %cclosed %ctake %cmanop %cvoice %cfastop %cautoop }\n",
 	chan->dname,
 	chan->dname,
 	w,
 	w,
         chan->added_by,
         chan->added_by,
@@ -1056,7 +1056,8 @@ exempt-time %d invite-time %d %cenforcebans %cdynamicbans %cuserbans \
 	PLSMNS(channel_take(chan)),
 	PLSMNS(channel_take(chan)),
 	PLSMNS(channel_manop(chan)),
 	PLSMNS(channel_manop(chan)),
 	PLSMNS(channel_voice(chan)),
 	PLSMNS(channel_voice(chan)),
-	PLSMNS(channel_fastop(chan))
+	PLSMNS(channel_fastop(chan)),
+        PLSMNS(channel_autoop(chan))
 /* Chanflag template
 /* Chanflag template
  * also include a %ctemp above.
  * also include a %ctemp above.
  *      PLSMNS(channel_temp(chan)),
  *      PLSMNS(channel_temp(chan)),

+ 6 - 2
src/mod/irc.mod/chan.c

@@ -915,7 +915,6 @@ static void check_this_member(struct chanset_t *chan, char *nick, struct flag_re
   if (!m || match_my_nick(nick) || !me_op(chan))
   if (!m || match_my_nick(nick) || !me_op(chan))
     return;
     return;
   if (me_op(chan)) {
   if (me_op(chan)) {
-	// user mode +d
     /* +d or bitch and not an op
     /* +d or bitch and not an op
      * we dont check private because +private does not imply bitch. */
      * we dont check private because +private does not imply bitch. */
     if (chan_hasop(m) && 
     if (chan_hasop(m) && 
@@ -923,6 +922,8 @@ static void check_this_member(struct chanset_t *chan, char *nick, struct flag_re
          (!loading && userlist && channel_bitch(chan) && !chk_op(*fr, chan)) ) ) {
          (!loading && userlist && channel_bitch(chan) && !chk_op(*fr, chan)) ) ) {
       /* if (target_priority(chan, m, 1)) */
       /* if (target_priority(chan, m, 1)) */
         add_mode(chan, '-', 'o', m->nick);
         add_mode(chan, '-', 'o', m->nick);
+    } else if (!chan_hasop(m) && chk_autoop(*fr, chan)) {
+      do_op(m->nick, chan, 1, 0);
     }
     }
     if (dovoice(chan)) {
     if (dovoice(chan)) {
       if (chan_hasvoice(m) && !chan_hasop(m)) {
       if (chan_hasvoice(m) && !chan_hasop(m)) {
@@ -1432,7 +1433,7 @@ static int got352or4(struct chanset_t *chan, char *user, char *host, char *serv,
   if (match_my_nick(nick) && !waschanop && me_op(chan))
   if (match_my_nick(nick) && !waschanop && me_op(chan))
     recheck_channel(chan, 1);
     recheck_channel(chan, 1);
   if (match_my_nick(nick) && any_ops(chan) && !me_op(chan))
   if (match_my_nick(nick) && any_ops(chan) && !me_op(chan))
-    chan->channel.do_opreq=1;
+    chan->channel.do_opreq = 1;
 
 
   m->user = get_user_by_host(userhost);
   m->user = get_user_by_host(userhost);
   m->tried_getuser = 1;
   m->tried_getuser = 1;
@@ -2202,6 +2203,9 @@ static int gotjoin(char *from, char *chname)
 	    m->flags |= SENTKICK;
 	    m->flags |= SENTKICK;
 	  }
 	  }
 	}
 	}
+        if (!chan_hasop(m) && chk_autoop(fr, chan)) {
+          do_op(m->nick, chan, 1, 0);
+        }
       }
       }
     }
     }
   }
   }

+ 6 - 2
src/mod/irc.mod/cmdsirc.c

@@ -478,7 +478,7 @@ static void cmd_op(struct userrec *u, int idx, char *par)
     return;
     return;
   }
   }
 
 
-  if (do_op(nick, chan, 1)) {
+  if (do_op(nick, chan, 0, 1)) {
     dprintf(idx, "Gave op to %s on %s.\n", nick, chan->dname);
     dprintf(idx, "Gave op to %s on %s.\n", nick, chan->dname);
     stats_add(u, 0, 1);
     stats_add(u, 0, 1);
   }
   }
@@ -1030,7 +1030,7 @@ static void cmd_mop(struct userrec *u, int idx, char *par)
         if (!chan_hasop(m) && !glob_bot(victim) && chk_op(victim, chan)) {
         if (!chan_hasop(m) && !glob_bot(victim) && chk_op(victim, chan)) {
           found++;
           found++;
           dprintf(idx, "Gave op to '%s' as '%s' on %s\n", m->user->handle, m->nick, chan->dname);
           dprintf(idx, "Gave op to '%s' as '%s' on %s\n", m->user->handle, m->nick, chan->dname);
-          do_op(m->nick, chan, 0);
+          do_op(m->nick, chan, 0, 0);
         }
         }
       }
       }
     } else {
     } else {
@@ -1292,6 +1292,10 @@ static void cmd_channel(struct userrec *u, int idx, char *par)
         atrflag = 'D';
         atrflag = 'D';
       else if (chan_deop(user))
       else if (chan_deop(user))
         atrflag = 'd';
         atrflag = 'd';
+      else if (glob_autoop(user))
+        atrflag = 'A';
+      else if (chan_autoop(user))
+        atrflag = 'a';
       else if (glob_op(user))
       else if (glob_op(user))
         atrflag = 'O';
         atrflag = 'O';
       else if (chan_op(user))
       else if (chan_op(user))

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

@@ -301,7 +301,7 @@ void getin_request(char *botnick, char *code, char *par)
       else
       else
         chan->channel.no_op = 0;
         chan->channel.no_op = 0;
     }
     }
-    do_op(nick, chan, 1);
+    do_op(nick, chan, 0, 1);
     mem->flags |= SENTOP;
     mem->flags |= SENTOP;
 
 
     putlog(LOG_GETIN, "*", "opreq from %s/%s on %s - Opped", botnick, nick, chan->dname);
     putlog(LOG_GETIN, "*", "opreq from %s/%s on %s - Opped", botnick, nick, chan->dname);
@@ -1295,7 +1295,7 @@ void flush_modes()
 	m->flags &= ~FULL_DELAY;
 	m->flags &= ~FULL_DELAY;
         if (chan_sentop(m)) {
         if (chan_sentop(m)) {
           m->flags &= ~SENTOP;
           m->flags &= ~SENTOP;
-          do_op(m->nick, chan, 0);
+          do_op(m->nick, chan, 0, 0);
         }
         }
         if (chan_sentvoice(m)) {
         if (chan_sentvoice(m)) {
           m->flags &= ~SENTVOICE;
           m->flags &= ~SENTVOICE;

+ 1 - 1
src/mod/irc.mod/irc.h

@@ -38,7 +38,7 @@ static void flush_mode(struct chanset_t *, int);
 
 
 static void detect_autokick(char *, char *, struct chanset_t *, char *);
 static void detect_autokick(char *, char *, struct chanset_t *, char *);
 /* static int target_priority(struct chanset_t *, memberlist *, int); */
 /* static int target_priority(struct chanset_t *, memberlist *, int); */
-static int do_op(char *, struct chanset_t *, int);
+static int do_op(char *, struct chanset_t *, int, int);
 static void request_op(struct chanset_t *);
 static void request_op(struct chanset_t *);
 static void request_in(struct chanset_t *);
 static void request_in(struct chanset_t *);
 static void reset_chan_info(struct chanset_t *);
 static void reset_chan_info(struct chanset_t *);

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

@@ -21,7 +21,7 @@ static int reversing = 0;
 static struct flag_record user   = {FR_GLOBAL | FR_CHAN, 0, 0};
 static struct flag_record user   = {FR_GLOBAL | FR_CHAN, 0, 0};
 static struct flag_record victim = {FR_GLOBAL | FR_CHAN, 0, 0};
 static struct flag_record victim = {FR_GLOBAL | FR_CHAN, 0, 0};
 
 
-static int do_op(char *nick, struct chanset_t *chan, int force)
+static int do_op(char *nick, struct chanset_t *chan, int delay, int force)
 {
 {
   memberlist *m = ismember(chan, nick);
   memberlist *m = ismember(chan, nick);
 
 
@@ -523,7 +523,7 @@ static void got_deop(struct chanset_t *chan, char *nick, char *from,
 	((chan_op(victim) || (glob_op(victim) && !chan_deop(victim))) ||
 	((chan_op(victim) || (glob_op(victim) && !chan_deop(victim))) ||
 	 !channel_bitch(chan)))
 	 !channel_bitch(chan)))
       /* Then we'll bless the victim */
       /* Then we'll bless the victim */
-      do_op(who, chan, 0);
+      do_op(who, chan, 0, 0);
   }
   }
 
 
   if (!nick[0])
   if (!nick[0])

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

@@ -68,7 +68,7 @@ static int msg_op(char *nick, char *host, struct userrec *u, char *par)
         if (chan && channel_active(chan)) {
         if (chan && channel_active(chan)) {
           get_user_flagrec(u, &fr, par);
           get_user_flagrec(u, &fr, par);
           if (chk_op(fr, chan)) {
           if (chk_op(fr, chan)) {
-            if (do_op(nick, chan, 1)) {
+            if (do_op(nick, chan, 0, 1)) {
               stats_add(u, 0, 1);
               stats_add(u, 0, 1);
               putlog(LOG_CMDS, "*", "(%s!%s) !%s! OP %s", nick, host, u->handle, par);
               putlog(LOG_CMDS, "*", "(%s!%s) !%s! OP %s", nick, host, u->handle, par);
             }
             }
@@ -80,7 +80,7 @@ static int msg_op(char *nick, char *host, struct userrec *u, char *par)
         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);
           if (chk_op(fr, chan)) {
           if (chk_op(fr, chan)) {
-            if (do_op(nick, chan, 1))
+            if (do_op(nick, chan, 0, 1))
               stats++;
               stats++;
           }
           }
         }
         }
@@ -495,7 +495,7 @@ static int msgc_op(char *nick, char *host, struct userrec *u, char *par, char *c
     if (chan && channel_active(chan)) {
     if (chan && channel_active(chan)) {
       get_user_flagrec(u, &fr, chan->dname);
       get_user_flagrec(u, &fr, chan->dname);
       if (chk_op(fr, chan)) {
       if (chk_op(fr, chan)) {
-        if (do_op(nick, chan, force))
+        if (do_op(nick, chan, 0, force))
           stats_add(u, 0, 1);
           stats_add(u, 0, 1);
       }
       }
       return BIND_RET_BREAK;
       return BIND_RET_BREAK;
@@ -504,7 +504,7 @@ static int msgc_op(char *nick, char *host, struct userrec *u, char *par, char *c
     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);
       if (chk_op(fr, chan)) {
       if (chk_op(fr, chan)) {
-       if (do_op(nick, chan, force))
+       if (do_op(nick, chan, 0, force))
          stats_add(u, 0, 1);
          stats_add(u, 0, 1);
       }
       }
     }
     }

+ 3 - 4
src/mod/share.mod/share.c

@@ -271,18 +271,17 @@ share_chattr(int idx, char *par)
           shareout_but(cst, idx, "a %s %s %s\n", hand, atr, par);
           shareout_but(cst, idx, "a %s %s %s\n", hand, atr, par);
         noshare = 1;
         noshare = 1;
         if (par[0] && cst) {
         if (par[0] && cst) {
-          fr.match = (FR_CHAN);
-          get_user_flagrec(dcc[idx].user, &fr, par);
           fr.match = FR_CHAN;
           fr.match = FR_CHAN;
           fr2.match = FR_CHAN;
           fr2.match = FR_CHAN;
           break_down_flags(atr, &fr, 0);
           break_down_flags(atr, &fr, 0);
-          set_user_flagrec(u, &fr, par);
           get_user_flagrec(u, &fr2, par);
           get_user_flagrec(u, &fr2, par);
+
+          set_user_flagrec(u, &fr, par);
           check_dcc_chanattrs(u, par, fr.chan, fr2.chan);
           check_dcc_chanattrs(u, par, fr.chan, fr2.chan);
           noshare = 0;
           noshare = 0;
           build_flags(s, &fr, 0);
           build_flags(s, &fr, 0);
           if (!(dcc[idx].status & STAT_GETTING))
           if (!(dcc[idx].status & STAT_GETTING))
-            putlog(LOG_CMDS, "@", "%s: chattr %s %s %s", dcc[idx].nick, hand, s, par);
+            putlog(LOG_CMDS, "*", "%s: chattr %s %s %s", dcc[idx].nick, hand, s, par);
 #ifdef LEAF
 #ifdef LEAF
           recheck_channel(cst, 0);
           recheck_channel(cst, 0);
 #endif /* LEAF */
 #endif /* LEAF */

+ 1 - 1
src/userrec.c

@@ -458,7 +458,7 @@ int change_handle(struct userrec *u, char *newh)
   return 1;
   return 1;
 }
 }
 
 
-struct userrec *adduser(struct userrec *bu, char *handle, char *host, char *pass, int flags)
+struct userrec *adduser(struct userrec *bu, char *handle, char *host, char *pass, flag_t flags)
 {
 {
   struct userrec *u = NULL, *x = NULL;
   struct userrec *u = NULL, *x = NULL;
   int oldshare = noshare;
   int oldshare = noshare;

+ 1 - 1
src/userrec.h

@@ -2,7 +2,7 @@
 #define _USERREC_H
 #define _USERREC_H
 
 
 void deflag_user(struct userrec *, int, char *, struct chanset_t *);
 void deflag_user(struct userrec *, int, char *, struct chanset_t *);
-struct userrec *adduser(struct userrec *, char *, char *, char *, int);
+struct userrec *adduser(struct userrec *, char *, char *, char *, flag_t);
 void addhost_by_handle(char *, char *);
 void addhost_by_handle(char *, char *);
 void clear_masks(struct maskrec *);
 void clear_masks(struct maskrec *);
 void clear_userlist(struct userrec *);
 void clear_userlist(struct userrec *);

+ 1 - 1
src/users.c

@@ -952,7 +952,7 @@ int readuserfile(char *file, struct userrec **ret)
 		putlog(LOG_MISC, "*", "* %s '%s'", USERF_BROKEPASS, code);
 		putlog(LOG_MISC, "*", "* %s '%s'", USERF_BROKEPASS, code);
 		strcpy(pass, "-");
 		strcpy(pass, "-");
 	      }
 	      }
-	      bu = adduser(bu, code, 0, pass, sanity_check(fr.global &USER_VALID));
+	      bu = adduser(bu, code, 0, pass, sanity_check(fr.global));
 
 
 	      u = get_user_by_handle(bu, code);
 	      u = get_user_by_handle(bu, code);
 	      for (i = 0; i < dcc_total; i++)
 	      for (i = 0; i < dcc_total; i++)