diff --git a/exec/ircd.js b/exec/ircd.js index 461bbaac2e6098b6689cf4865417d46a2b256f6c..f56134237d90d37dcdcd283685ae9821e512dea0 100644 --- a/exec/ircd.js +++ b/exec/ircd.js @@ -111,18 +111,6 @@ function true_array_len(my_array) { return counter; } -// Sigh, socket_select only accepts a sequential array with numerical indexes. -// This rebuilds the array whenever someone connects or disconnects. -function rebuild_socksel_array() { - Selectable_Sockets = new Array; - Selectable_Sockets_Map = new Array; - for (i in Local_Sockets) { - Selectable_Sockets.push(Local_Sockets[i]); - Selectable_Sockets_Map.push(Local_Sockets_Map[i]); - } - restart_socksel_loop = true; -} - function ip_to_int(ip) { var quads = ip.split("."); var addr = (quads[0]&0xff)<<24; @@ -667,7 +655,7 @@ Local_Unreg = new Array; Local_Users = new Array; Local_Servers = new Array; -restart_socksel_loop = false; +rebuild_socksel_array = false; sync_310 = false; network_debug = false; @@ -760,24 +748,33 @@ while (!server.terminated) { } } + if (rebuild_socksel_array) { + Selectable_Sockets = new Array; + Selectable_Sockets_Map = new Array + for (i in Local_Sockets) { + Selectable_Sockets.push(Local_Sockets[i]); + Selectable_Sockets_Map.push(Local_Sockets_Map[i]); + } + rebuild_socksel_array = false; + } + // Check for ping timeouts, and, do work on the sockets if we're 3.10 for(this_sock in Selectable_Sockets) { - if (Selectable_Sockets_Map[this_sock].check_timeout()) + if (Selectable_Sockets_Map[this_sock] && + Selectable_Sockets_Map[this_sock].check_timeout()) continue; if(this.socket_select==undefined) Selectable_Sockets_Map[this_sock].work(); } // do some work. - restart_socksel_loop = false; if (!Selectable_Sockets.length) { mswait(1000); } else if (this.socket_select!=undefined) { var readme = socket_select(Selectable_Sockets, 1 /*secs*/); for(thisPolled in readme) { - Selectable_Sockets_Map[readme[thisPolled]].work(); - if (restart_socksel_loop) - break; + if (Selectable_Sockets_Map[readme[thisPolled]]) + Selectable_Sockets_Map[readme[thisPolled]].work(); } } @@ -3160,7 +3157,7 @@ function IRCClient_setusermode(modestr) { bcast_modestr += "+" + bcast_addmodes; if (bcast_delmodes) bcast_modestr += "-" + bcast_delmodes; - if (!this.local) { + if (this.local) { this.originatorout("MODE "+this.nick+" "+final_modestr,this); if (bcast_addmodes || bcast_delmodes) this.bcast_to_servers("MODE "+this.nick+" "+bcast_modestr,this); diff --git a/exec/load/ircd_server.js b/exec/load/ircd_server.js index b09194759f31eed7ab27a2c51d551ad445197422..9be40b3b8d26cd2600ab9cb115d6a68528f4e359 100644 --- a/exec/load/ircd_server.js +++ b/exec/load/ircd_server.js @@ -1023,7 +1023,7 @@ function Server_Quit(str,suppress_bcast,is_netsplit,origin) { delete Local_Servers[this.id]; delete Servers[this.nick.toLowerCase()]; delete this; - rebuild_socksel_array(); + rebuild_socksel_array = true; } function IRCClient_synchronize() { diff --git a/exec/load/ircd_unreg.js b/exec/load/ircd_unreg.js index 88a65805d6b1323f9116c79fe4edff48900ec337..0131a0239327dff186334cb5382f41ebc00e87da 100644 --- a/exec/load/ircd_unreg.js +++ b/exec/load/ircd_unreg.js @@ -60,7 +60,7 @@ function Unregistered_Client(id,socket) { // We're a local socket that must be polled. Local_Sockets[id] = socket.descriptor; Local_Sockets_Map[id] = this; - rebuild_socksel_array(); + rebuild_socksel_array = true; log(format("%04u",socket.descriptor) + " Accepted new connection: " + socket.remote_ip_address + " port " + socket.remote_port); @@ -217,7 +217,7 @@ function Unregistered_Commands() { var new_server = Servers[cmd[1].toLowerCase()]; Local_Servers[this.id] = new_server; Local_Sockets_Map[this.id] = new_server; - rebuild_socksel_array(); + rebuild_socksel_array = true; new_server.socket = this.socket; new_server.hops = cmd[2]; new_server.info = IRC_string(cmdline); @@ -317,7 +317,7 @@ function Unregistered_Commands() { new_user = Users[this.nick.toUpperCase()]; Local_Sockets_Map[this.id] = new_user; Local_Users[this.id] = new_user; - rebuild_socksel_array(); + rebuild_socksel_array = true; new_user.socket = this.socket; new_user.nick = this.nick; new_user.uprefix = this.uprefix; @@ -356,6 +356,6 @@ function Unregistered_Quit(msg) { delete Local_Sockets_Map[this.id]; delete Unregistered[this.id]; delete this; - rebuild_socksel_array(); + rebuild_socksel_array = true; } diff --git a/exec/load/ircd_user.js b/exec/load/ircd_user.js index 2f76752368c4fe8c9341d1ecba41e57b746fae80..f4d5a6723f2cb22676bec08225e1414662bdce3c 100644 --- a/exec/load/ircd_user.js +++ b/exec/load/ircd_user.js @@ -1452,6 +1452,6 @@ function User_Quit(str,suppress_bcast,is_netsplit,origin) { delete Local_Users[this.id]; delete Users[this.nick.toUpperCase()]; delete this; - rebuild_socksel_array(); + rebuild_socksel_array = true; }