Browse Source

* Fixed disconnect_server()
* Fixed BT_msgc bind in irc.mod (pubc)
* Fixed some misc bugs
* Added a debug putlog for bind_entry_exec()


svn: 627

Bryan Drewery 22 năm trước cách đây
mục cha
commit
8ff868ca10

+ 1 - 0
src/core_binds.c

@@ -78,6 +78,7 @@ void check_bind_dcc(const char *cmd, int idx, const char *text)
   }
 #endif /* S_DCCPASS */
   x = check_bind(BT_dcc, cmd, &fr, dcc[idx].user, idx, text);
+putlog(LOG_MISC, "*", "RETURNED: %d", x);
   if (x == -1)
     dprintf(idx, "What?  You need '%shelp'\n", dcc_prefix);
   else if (x & BIND_RET_LOG) {

+ 2 - 2
src/dccutil.c

@@ -324,7 +324,7 @@ void lostdcc(int n)
     free(dcc[n].u.other);
   egg_bzero(&dcc[n], sizeof(struct dcc_t));
 
-  dcc[n].sock = (-1);
+  dcc[n].sock = -1;
   dcc[n].type = &DCC_LOST;
 }
 
@@ -358,7 +358,7 @@ void dcc_remove_lost(void)
   for (i = 0; i < dcc_total; i++) {
     if (dcc[i].type == &DCC_LOST) {
       dcc[i].type = NULL;
-      dcc[i].sock = (-1);
+      dcc[i].sock = -1;
       removedcc(i);
       i--;
     }

+ 5 - 7
src/mod/irc.mod/irc.c

@@ -852,7 +852,7 @@ static void newmask(masklist *m, char *s, char *who)
 
 /* Removes a nick from the channel member list (returns 1 if successful)
  */
-static int killmember(struct chanset_t *chan, char *nick)
+static int real_killmember(struct chanset_t *chan, char *nick, const char *file, int line)
 {
   memberlist *x, *old;
 
@@ -862,7 +862,7 @@ static int killmember(struct chanset_t *chan, char *nick)
       break;
   if (!x || !x->nick[0]) {
     if (!channel_pending(chan))
-      putlog(LOG_MISC, "*", "(!) killmember(%s) -> nonexistent", nick);
+      putlog(LOG_MISC, "*", "(!) killmember(%s, %s) -> nonexistent (%s: %d)", chan->dname, nick, file, line);
     return 0;
   }
   if (old)
@@ -879,8 +879,7 @@ static int killmember(struct chanset_t *chan, char *nick)
      chan->channel.members = 0;
      for (x = chan->channel.member; x && x->nick[0]; x = x->next)
        chan->channel.members++;
-     putlog(LOG_MISC, "*", "(!) actually I know of %d members.",
-	    chan->channel.members);
+     putlog(LOG_MISC, "*", "(!) actually I know of %d members.", chan->channel.members);
   }
   if (!chan->channel.member) {
     chan->channel.member = (memberlist *) calloc(1, sizeof(memberlist));
@@ -1270,9 +1269,7 @@ static void check_expired_chanstuff()
 static int check_bind_pubc(char *cmd, char *nick, char *from, struct userrec *u, char *args, char *chan)
 {
   struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
-  int x;
-
-  x = check_bind(BT_msgc, cmd, &fr, nick, from, u, args, chan);
+  int x = check_bind(BT_msgc, cmd, &fr, nick, from, u, args, chan);
 
   if (x & BIND_RET_LOG)
     putlog(LOG_CMDS, "*", "(%s!%s) !%s! %s %s%s %s", nick, from, u ? u->handle : "*", chan, cmdprefix, cmd, args);
@@ -1603,6 +1600,7 @@ char *irc_start(Function * global_funcs)
 
   BT_ctcp = bind_table_lookup("ctcp");
   BT_ctcr = bind_table_lookup("ctcr");
+  BT_msgc = bind_table_lookup("msgc");
 
   /* Add our commands to the imported tables. */
   add_builtins("dcc", irc_dcc);

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

@@ -47,7 +47,8 @@ static void doban(struct chanset_t *, memberlist *);
 static char *quickban(struct chanset_t *, char *);
 static void got_op(struct chanset_t *chan, char *nick, char *from, char *who,
  		   struct userrec *opu, struct flag_record *opper);
-static int killmember(struct chanset_t *chan, char *nick);
+static int real_killmember(struct chanset_t *chan, char *nick, const char *file, int line);
+#define killmember(chan, nick)        real_killmember((chan), (nick), __FILE__,__LINE__)
 static void check_lonely_channel(struct chanset_t *chan);
 static int gotmode(char *, char *);
 void raise_limit(struct chanset_t *);

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

@@ -76,7 +76,7 @@ static int optimize_kicks;
 
 static void empty_msgq(void);
 static void next_server(int *, char *, unsigned int *, char *);
-static void disconnect_server();
+static void disconnect_server(int);
 static int calc_penalty(char *);
 static int fast_deq(int);
 static char *splitnicks(char **);
@@ -1371,7 +1371,7 @@ static void server_5minutely()
       /* Uh oh!  Never got pong from last time, five minutes ago!
        * Server is probably stoned.
        */
-      disconnect_server();
+      disconnect_server(1);
       putlog(LOG_SERV, "*", IRC_SERVERSTONED);
     } else if (!trying_server) {
       /* Check for server being stoned. */

+ 11 - 13
src/mod/server.mod/servmsg.c

@@ -247,7 +247,7 @@ static void nuke_server(char *reason)
 {
   if (serv >= 0) {
     if (reason && (servidx > 0)) dprintf(servidx, "QUIT :%s\r\n", reason);
-    disconnect_server();
+    disconnect_server(1);
   }
 }
 
@@ -888,22 +888,20 @@ static int gotmode(char *from, char *msg)
   return 0;
 }
 
-static void disconnect_server()
-{
-	int idx;
 
+static void disconnect_server(int dolost)
+{
 	if (server_online > 0) check_bind_event("disconnect-server");
-
 	server_online = 0;
-	if (servidx != -1 && dcc[servidx].sock >= 0) {
+
+	if (servidx != -1 && dcc[servidx].sock >= 0 && serv == dcc[servidx].sock) {
 		killsock(dcc[servidx].sock);
-		dcc[servidx].sock = (-1);
+		dcc[servidx].sock = -1;
+		if (dolost) lostdcc(servidx);
 	}
+	servidx = -1;
 	serv = -1;
 	botuserhost[0] = 0;
-	idx = servidx;
-	servidx = -1;
-	lostdcc(idx);
 }
 
 static void eof_server(int idx)
@@ -919,7 +917,7 @@ static void eof_server(int idx)
   }
 }
 #endif /* S_AUTH */
-  disconnect_server();
+  disconnect_server(1);
 }
 
 static void display_server(int idx, char *buf)
@@ -934,7 +932,7 @@ static void kill_server(int idx, void *x)
 {
   module_entry *me;
 
-  disconnect_server();
+  disconnect_server(0);
   if ((me = module_find("channels", 0, 0)) && me->funcs) {
     struct chanset_t *chan;
 
@@ -948,7 +946,7 @@ static void kill_server(int idx, void *x)
 static void timeout_server(int idx)
 {
   putlog(LOG_SERV, "*", "Timeout: connect to %s", dcc[idx].host);
-  disconnect_server();
+  disconnect_server(1);
 }
 
 static void server_activity(int idx, char *msg, int len);

+ 1 - 0
src/tclhash.c

@@ -304,6 +304,7 @@ int check_bind(bind_table_t *table, const char *match, struct flag_record *flags
 	int i, cmp, retval;
 	va_list ap;
 
+	Assert(table);
 	check_bind_executing++;
 
 	va_start(ap, flags);