diff --git a/exec/binkit.js b/exec/binkit.js index dc628d770d1c8660b7f2f59857fa0b21448b4d88..4afb7c704b4be1713254d0aa331ea82c2cbc5114 100644 --- a/exec/binkit.js +++ b/exec/binkit.js @@ -566,45 +566,7 @@ function callout(addr, scfg, locks, bicfg) else src_addr = addr; // Sort by "distance" from src_addr address. - bp.addr_list.sort(function(addr1, addr2) { - var dist1; - var dist2; - - if (addr1.str === src_addr.str) - return -1; - if (addr2.str === src_addr.str) - return 1; - if (addr1.domain !== addr2.domain) { - if (addr1.domain === src_addr.domain) - return -1; - if (addr2.domain === src_addr.domain) - return 1; - if (addr1.domain < addr2.domain) - return -1; - return 1; - } - if (addr1.zone !== addr2.zone) { - dist1 = Math.abs(addr1.zone - src_addr.zone); - dist2 = Math.abs(addr2.zone - src_addr.zone); - return dist1-dist2; - } - if (addr1.net !== addr2.net) { - dist1 = Math.abs(addr1.net - src_addr.net); - dist2 = Math.abs(addr2.net - src_addr.net); - return dist1-dist2; - } - if (addr1.node !== addr2.node) { - dist1 = Math.abs(addr1.node - src_addr.node); - dist2 = Math.abs(addr2.node - src_addr.node); - return dist1-dist2; - } - if (addr1.point !== addr2.point) { - dist1 = Math.abs(addr1.point - src_addr.point); - dist2 = Math.abs(addr2.point - src_addr.point); - return dist1-dist2; - } - return 0; - }); + FIDO.distance_sort(bp.addr_list, src_addr); log(LOG_DEBUG, format("connecting to %s at %s", addr, host)); // We won't add files until the auth finishes... diff --git a/exec/load/fido.js b/exec/load/fido.js index ddafa51686cfe5c9d50f5370df8e92fec002eb80..683738e668c5c3bf3049b792fba8636ddd36fba5 100644 --- a/exec/load/fido.js +++ b/exec/load/fido.js @@ -37,6 +37,10 @@ require('fido_syscfg.js', 'FTNDomains'); * it containing all the nodelist entries (4D address is the key * unless domain is specified in which case 5D address is the key). * If warn is true, will warn on "illegal" values (per FTS-0005). + * + * FIDO.distance_sort(array, anchor) + * Sorts an array of addresses by increasing distance from anchor. + * The elements of the array and anchor should be FIDO.Addr objects. */ var FIDO = { @@ -424,7 +428,7 @@ var FIDO = { this.messages.push(new FIDO.PackedMessage(this, offset)); } } - } + }, /* * Suggested kludge lines: * INTL: (FTS-0001) @@ -433,6 +437,49 @@ var FIDO = { * TZUTC: (FTS-4008) * PID: (FTS- */ + distance_sort:function(addrs, anchor) + { + // Sort by "distance" from anchor. + addrs.sort(function(addr1, addr2) { + var dist1; + var dist2; + + if (addr1.str === anchor.str) + return -1; + if (addr2.str === anchor.str) + return 1; + if (addr1.domain !== addr2.domain) { + if (addr1.domain === anchor.domain) + return -1; + if (addr2.domain === anchor.domain) + return 1; + if (addr1.domain < addr2.domain) + return -1; + return 1; + } + if (addr1.zone !== addr2.zone) { + dist1 = Math.abs(addr1.zone - anchor.zone); + dist2 = Math.abs(addr2.zone - anchor.zone); + return dist1-dist2; + } + if (addr1.net !== addr2.net) { + dist1 = Math.abs(addr1.net - anchor.net); + dist2 = Math.abs(addr2.net - anchor.net); + return dist1-dist2; + } + if (addr1.node !== addr2.node) { + dist1 = Math.abs(addr1.node - anchor.node); + dist2 = Math.abs(addr2.node - anchor.node); + return dist1-dist2; + } + if (addr1.point !== addr2.point) { + dist1 = Math.abs(addr1.point - anchor.point); + dist2 = Math.abs(addr2.point - anchor.point); + return dist1-dist2; + } + return 0; + }); + } }; Object.defineProperties(FIDO.Addr.prototype, { 'str': { diff --git a/exec/tickit.js b/exec/tickit.js index 5343ef19b932e7cb7b499cbff4d1d944099b0dc9..88b26d3de446ad78a966ba3cce3c4408b577fb83 100644 --- a/exec/tickit.js +++ b/exec/tickit.js @@ -24,8 +24,8 @@ */ load("sbbsdefs.js"); -load("fidocfg.js"); -load("fido.js"); +require("fidocfg.js", 'TickITCfg'); +require("fido.js", 'FIDO'); var sbbsecho = new SBBSEchoCfg(); var tickit = new TickITCfg(); @@ -214,34 +214,6 @@ function add_links(seenbys, links, list) } } -function parse_addr(addr, dz) -{ - var m; - var ret={zone:dz, net:0, node:0, point:0}; - - m = addr.match(/^([0-9]+):/); - if (m !== null) - ret.zone = parseInt(m[1], 10); - - m = addr.match(/([0-9]+)\//); - if (m !== null) - ret.net = parseInt(m[1], 10); - - m = addr.match(/\/([0-9]+)/); - if (m !== null) - ret.node = parseInt(m[1], 10); - - m = addr.match(/\.([0-9]+)/); - if (m !== null) - ret.point = parseInt(m[1], 10); - - m = addr.match(/@.+$/); - if (m !== null) - ret.domain = m[1]; - - return ret; -} - function get_zone(addr) { var m; @@ -268,13 +240,18 @@ function forward_tic(tic) var flobase; var pw; var i; + var addrs; + var saddr; defzone = get_zone(system.fido_addr_list[0]); if (defzone === undefined) { - log(LOG_ERROR, "Unable to detect default zone!"); + log(LOG_ERROR, "Unable to detect fido_addr_listdefault zone!"); return false; } + for (saddr in system.fido_addr_list) + addrs.push(FIDO.parse_addr(system.fido_addr_list[saddr])); + // Add us to the path... tic.path.push(system.fido_addr_list[0]); @@ -310,7 +287,7 @@ function forward_tic(tic) pw = ''; // Figure out the outbound dir... - addr = parse_addr(link, defzone); + addr = FIDO.parse_addr(link, defzone); if (addr.zone === undefined) addr.zone = defzone; @@ -341,7 +318,9 @@ function forward_tic(tic) } tf.write(tic[' forward'].join("\r\n")); tf.write('\r\n'); - tf.write('From '+system.fido_addr_list[0]+'\r\n'); + // TODO: Use BinkpSourceAddress? + FIDO.distance_sort(addrs, addr); + tf.write('From '+addrs[0]+'\r\n'); tf.write('To '+link+'\r\n'); tf.write('Pw '+pw+'\r\n'); for (i=0; i<tic.path.length; i++)