diff --git a/src/syncterm/rlogin.c b/src/syncterm/rlogin.c index 5a09f511a6f8ede8c793a7eec8fc4dfe452ce0f6..84c21f8d6bbb62aff75d8dce371a042265ec8d9c 100644 --- a/src/syncterm/rlogin.c +++ b/src/syncterm/rlogin.c @@ -5,15 +5,16 @@ static SOCKET rlogin_socket=INVALID_SOCKET; -int rlogin_recv(char *buffer, size_t buflen, unsigned int timeout) +int rlogin_recv(char *buffer, size_t buflen) { int r; - if(!socket_check(rlogin_socket, &r, NULL, timeout)) + if(!socket_check(rlogin_socket, NULL, NULL, 0)) return(-1); - if(!r) - return(0); - return(recv(rlogin_socket,buffer,buflen,0)); + r=recv(rlogin_socket,buffer,buflen,0); + if(r==-1 && (errno==EAGAIN || errno==EINTR)) + r=0; + return(r); } int rlogin_send(char *buffer, size_t buflen, unsigned int timeout) @@ -50,6 +51,7 @@ int rlogin_connect(char *addr, int port, char *ruser, char *passwd) char nil=0; char *p; unsigned int neta; + struct timeval tv; for(p=addr;*p;p++) if(*p!='.' && !isdigit(*p)) @@ -90,6 +92,11 @@ int rlogin_connect(char *addr, int port, char *ruser, char *passwd) return(-1); } + tv.tv_sec=0; + tv.tv_usec=100000; + + setsockopt(rlogin_socket, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); + rlogin_send("",1,1000); rlogin_send(passwd,strlen(passwd)+1,1000); rlogin_send(ruser,strlen(ruser)+1,1000); diff --git a/src/syncterm/rlogin.h b/src/syncterm/rlogin.h index 1589bd0cf66e9e54f59387192f05038eccf553bb..8f8d9940d38e3cfacae3137ff44fac2c9581dae3 100644 --- a/src/syncterm/rlogin.h +++ b/src/syncterm/rlogin.h @@ -5,7 +5,7 @@ extern SOCKET rlogin_socket; -int rlogin_recv(char *buffer, size_t buflen, unsigned int timeout); +int rlogin_recv(char *buffer, size_t buflen); int rlogin_send(char *buffer, size_t buflen, unsigned int timeout); int rlogin_connect(char *addr, int port, char *ruser, char *passwd); int rlogin_close(void); diff --git a/src/syncterm/term.c b/src/syncterm/term.c index 640222aaf6953f3820aea9941a177fc3d0f98079..72d83a89f2f7b2747383a8887ef5b40245a477f9 100644 --- a/src/syncterm/term.c +++ b/src/syncterm/term.c @@ -5,6 +5,8 @@ #include "uifcinit.h" #include "menu.h" +#define BUFSIZE 2048 + struct terminal term; const int tabs[11]={1,8,16,24,32,40,48,56,64,72,80}; @@ -495,8 +497,10 @@ void do_ansi(void) void doterm(void) { unsigned char ch[2]; + unsigned char buf[BUFSIZE]; + unsigned char prn[BUFSIZE]; int key; - int i; + int i,j; term.xpos=1; term.ypos=1; @@ -516,86 +520,110 @@ void doterm(void) /* Main input loop */ for(;;) { /* Get remote input */ - i=rlogin_recv(ch,1,100); + i=rlogin_recv(buf,sizeof(buf)); switch(i) { case -1: uifcmsg("Disconnected","`Disconnected`\n\nRemote host dropped connection"); return; - case 1: - if(term.sequence) { - strcat(term.escbuf,ch); - if((ch[0]>='@' && ch[0]<='Z') - || (ch[0]>='a' && ch[0]<='z')) { - do_ansi(); + case 0: + break; + default: + prn[0]=0; + for(j=0;j<i;j++) { + ch[0]=buf[j]; + if(term.sequence) { + strcat(term.escbuf,ch); + if((ch[0]>='@' && ch[0]<='Z') + || (ch[0]>='a' && ch[0]<='z')) { + do_ansi(); + } } - } - else if (term.music) { - strcat(term.musicbuf,ch); - if(ch[0]==14) - play_music(); - } - else { - switch(ch[0]) { - case 0: - break; - case 7: /* Beep */ - #ifdef __unix__ - beep(); - #else - MessageBeep(MB_OK); - #endif - break; - case 12: /* ^L - Clear screen */ - clearscreen(term.attr); - term.ypos=1; - term.xpos=1; - set_cursor(); - break; - case 27: /* ESC */ - term.sequence=1; - break; - case '\n': - term.ypos++; - if(term.ypos>term.height) { - term.ypos=term.height; - scrollup(); - } - set_cursor(); - break; - case '\t': - for(i=0;i<11;i++) { - if(tabs[i]>term.xpos) { - term.xpos=tabs[i]; - break; - } - } - set_cursor(); - break; - case '\r': - term.xpos=1; - set_cursor(); - break; - case '\b': - term.xpos--; - if(term.xpos<1) - term.xpos=1; - putch(' '); - set_cursor(); - break; - default: - putch(ch[0]); - term.xpos++; - if(term.xpos>term.width) { + else if (term.music) { + strcat(term.musicbuf,ch); + if(ch[0]==14) + play_music(); + } + else { + switch(buf[j]) { + case 0: + break; + case 7: /* Beep */ + cprintf(prn); + prn[0]=0; + #ifdef __unix__ + beep(); + #else + MessageBeep(MB_OK); + #endif + break; + case 12: /* ^L - Clear screen */ + cprintf(prn); + prn[0]=0; + clearscreen(term.attr); + term.ypos=1; term.xpos=1; + set_cursor(); + break; + case 27: /* ESC */ + cprintf(prn); + prn[0]=0; + term.sequence=1; + break; + case '\n': + cprintf(prn); + prn[0]=0; term.ypos++; if(term.ypos>term.height) { term.ypos=term.height; scrollup(); } set_cursor(); - } + break; + case '\t': + cprintf(prn); + prn[0]=0; + for(i=0;i<11;i++) { + if(tabs[i]>term.xpos) { + term.xpos=tabs[i]; + break; + } + } + set_cursor(); + break; + case '\r': + cprintf(prn); + prn[0]=0; + term.xpos=1; + set_cursor(); + break; + case '\b': + cprintf(prn); + prn[0]=0; + term.xpos--; + if(term.xpos<1) + term.xpos=1; + putch(' '); + set_cursor(); + break; + default: + strcat(prn,ch); + term.xpos++; + if(term.xpos>term.width) { + cprintf(prn); + prn[0]=0; + term.xpos=1; + term.ypos++; + if(term.ypos>term.height) { + term.ypos=term.height; + scrollup(); + } + set_cursor(); + } + } } } + cprintf(prn); + prn[0]=0; break; }