From e3ae8d6149041a6a19051cd6e3723a54dbe724d8 Mon Sep 17 00:00:00 2001 From: "Mirar (Pontus Hagland)" <pike@sort.mirar.org> Date: Tue, 24 Feb 1998 23:22:09 +0100 Subject: [PATCH] timeout added for connect Rev: lib/modules/Remote.pmod/Client.pike:1.4 Rev: lib/modules/Remote.pmod/Server.pike:1.5 Rev: lib/modules/Remote.pmod/connection.pike:1.8 --- lib/modules/Remote.pmod/Client.pike | 6 ++--- lib/modules/Remote.pmod/Server.pike | 1 + lib/modules/Remote.pmod/connection.pike | 31 ++++++++++++++++++++++--- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/lib/modules/Remote.pmod/Client.pike b/lib/modules/Remote.pmod/Client.pike index d8e095dddd..704dea0550 100644 --- a/lib/modules/Remote.pmod/Client.pike +++ b/lib/modules/Remote.pmod/Client.pike @@ -13,10 +13,10 @@ object get(string name) } -void create(string host, int port) +void create(string host, int port, void|int nice, int ...timeout) { - con = Connection(); - if(!con->connect(host, port)) + con = Connection(nice); + if(!con->connect(host, port, @timeout)) error("Could not connect to server"); connected = 1; con->closed = 0; diff --git a/lib/modules/Remote.pmod/Server.pike b/lib/modules/Remote.pmod/Server.pike index 4f100a7b6f..478c4fd6af 100644 --- a/lib/modules/Remote.pmod/Server.pike +++ b/lib/modules/Remote.pmod/Server.pike @@ -49,6 +49,7 @@ void create(string host, int p) { portno = p; port = Stdio.Port(); + port->set_id(port); if(host) { if(!port->bind(p, got_connection, host)) diff --git a/lib/modules/Remote.pmod/connection.pike b/lib/modules/Remote.pmod/connection.pike index 4f4cc988bf..77fb91f2ea 100644 --- a/lib/modules/Remote.pmod/connection.pike +++ b/lib/modules/Remote.pmod/connection.pike @@ -6,18 +6,28 @@ object con; object ctx; array(function) close_callbacks = ({ }); +int nice; // don't throw from call_sync + void handshake(int ignore, string s); void read_some(int ignore, string s); void write_some(int|void ignore); void closed_connection(int|void ignore); +// - create + +void create(void|int _nice) +{ + nice=_nice; +} + // - connect // // This function is called by clients to connect to a server. // -int connect(string host, int port) +int connect(string host, int port, int ... timeout) { string s, sv; + int end_time=time()+(sizeof(timeout)?(timeout[0]||1):60); DEBUGMSG("connecting to "+host+":"+port+"...\n"); @@ -29,7 +39,19 @@ int connect(string host, int port) return 0; DEBUGMSG("connected\n"); con->write("Pike remote client "+PROTO_VERSION+"\n"); - s = con->read(24); + s=""; + con->set_nonblocking(); + for (;;) + { + s += (con->read(24-strlen(s),1)||""); + if (strlen(s)==24) break; + sleep(0.02); + if (time()>end_time) + { + con->close(); + return 0; + } + } if((sscanf(s,"Pike remote server %4s\n", sv) == 1) && (sv == PROTO_VERSION)) { ctx = Context(replace(con->query_address(1), " ", "-"), this_object()); @@ -261,7 +283,10 @@ mixed call_sync(array data) if(!s || !strlen(s)) { closed_connection(); - error("Could not read"); + if (!nice) + error("Could not read"); + else + return ([])[0]; // failed, like } read_some(0,s); } -- GitLab