diff --git a/src/syncterm/rlogin.c b/src/syncterm/rlogin.c index 0ae44b150c72b6eb85631316f3c507a71b4cb0b0..d3e261e0d68dc5abbfc10561bd86cf4c1206ad5a 100644 --- a/src/syncterm/rlogin.c +++ b/src/syncterm/rlogin.c @@ -5,6 +5,8 @@ static SOCKET rlogin_socket=INVALID_SOCKET; +int rcvtimeo=1; + int rlogin_recv(char *buffer, size_t buflen) { int r; @@ -51,7 +53,6 @@ int rlogin_connect(char *addr, int port, char *ruser, char *passwd, int bedumb) char nil=0; char *p; unsigned int neta; - unsigned long l; for(p=addr;*p;p++) if(*p!='.' && !isdigit(*p)) @@ -93,9 +94,22 @@ int rlogin_connect(char *addr, int port, char *ruser, char *passwd, int bedumb) return(-1); } - l=1; - ioctlsocket(rlogin_socket, FIONBIO,&l); - /* fcntl(rlogin_socket, F_SETFL, fcntl(rlogin_socket, F_GETFL)|O_NONBLOCK); */ + if(rcvtimeo) { + #ifdef _WIN32 + int tv=10; + #else + struct timeval tv; + + tv.tv_sec=0; + tv.tv_usec=10000; + #endif + + setsockopt(rlogin_socket,SOL_SOCKET,SO_RCVTIMEO,&tv,sizeof(tv)); + } + else { + unsigned long l=1; + ioctlsocket(rlogin_socket, FIONBIO,&l); + } if(!bedumb) { rlogin_send("",1,1000); diff --git a/src/syncterm/rlogin.h b/src/syncterm/rlogin.h index 3375654803b890e96a13f950cd6a0d4beef1af82..7db1ae18fee75ec71936112da07378e624dbe71a 100644 --- a/src/syncterm/rlogin.h +++ b/src/syncterm/rlogin.h @@ -4,6 +4,7 @@ #include <sockwrap.h> extern SOCKET rlogin_socket; +extern int rcvtimeo; int rlogin_recv(char *buffer, size_t buflen); int rlogin_send(char *buffer, size_t buflen, unsigned int timeout); diff --git a/src/syncterm/term.c b/src/syncterm/term.c index af5eb0bec7db7880eaf99afb86e9b846d56a7026..648eefbf80c4be345f5c733010e43c8fc21b0ba2 100644 --- a/src/syncterm/term.c +++ b/src/syncterm/term.c @@ -2,6 +2,7 @@ #include <ciolib.h> #include <keys.h> +#include "rlogin.h" #include "term.h" #include "uifcinit.h" #include "menu.h" @@ -117,6 +118,7 @@ void doterm(void) } } - SLEEP(1); + if(!rcvtimeo) + SLEEP(1); } }