From f9e799d9ad931a61b29d9d1b8eb313d034efc690 Mon Sep 17 00:00:00 2001 From: rswindell <> Date: Wed, 14 Mar 2001 22:01:05 +0000 Subject: [PATCH] Added support for SOCKET_READLINE function. --- src/sbbs3/exec.cpp | 1 + src/sbbs3/execnet.cpp | 64 ++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 61 insertions(+), 4 deletions(-) diff --git a/src/sbbs3/exec.cpp b/src/sbbs3/exec.cpp index f4c3d2dea2..5e891e7d1f 100644 --- a/src/sbbs3/exec.cpp +++ b/src/sbbs3/exec.cpp @@ -759,6 +759,7 @@ void sbbs_t::skipto(csi_t *csi, uchar inst) csi->ip+=4; /* intvar */ continue; case CS_SOCKET_READ: + case CS_SOCKET_READLINE: case CS_SOCKET_PEEK: csi->ip+=4; /* socket */ csi->ip+=4; /* buffer */ diff --git a/src/sbbs3/execnet.cpp b/src/sbbs3/execnet.cpp index a0519192e3..0d0461ab02 100644 --- a/src/sbbs3/execnet.cpp +++ b/src/sbbs3/execnet.cpp @@ -38,12 +38,15 @@ #include "sbbs.h" #include "cmdshell.h" +#define SOCK_READLINE_TIMEOUT 5 /* seconds */ + int sbbs_t::exec_net(csi_t* csi) { - char str[512],rsp[512],buf[1025],*p,**pp,**pp1,**pp2; + char str[512],rsp[512],buf[1025],ch,*p,**pp,**pp1,**pp2; ushort w; uint i; long *lp,*lp1,*lp2; + time_t start; switch(*(csi->ip++)) { /* sub-op-code stored as next byte */ case CS_SOCKET_OPEN: @@ -198,6 +201,56 @@ int sbbs_t::exec_net(csi_t* csi) } else csi->socket_error=ERROR_VALUE; return(0); + case CS_SOCKET_READLINE: + lp=getintvar(csi,*(long *)csi->ip); /* socket */ + csi->ip+=4; + pp=getstrvar(csi,*(long *)csi->ip); /* buffer */ + csi->ip+=4; + w=*(ushort *)csi->ip; /* length */ + csi->ip+=2; + + csi->logic=LOGIC_FALSE; + csi->socket_error=0; + + if(!lp || !pp) + return(0); + + if(w<1 || w>sizeof(buf)-1) + w=sizeof(buf)-1; + + start=time(NULL); + for(i=0;i<w;i++) { + + if(!online) + return(1); + + if(!socket_check(*lp)) + return(0); + + if(time(NULL)-start>SOCK_READLINE_TIMEOUT) { + lprintf("!socket_readline: timeout (%d) exceeded" + ,SOCK_READLINE_TIMEOUT); + return(0); + } + + if(recv(*lp, &ch, 1, 0)!=1) { + csi->socket_error=ERROR_VALUE; + return(0); + } + + if(ch=='\n' && i>=1) + break; + + buf[i]=ch; + } + buf[i-1]=0; + if(csi->etx) { + p=strchr(buf,csi->etx); + if(p) *p=0; + } + *pp=copystrvar(csi,*pp,buf); + csi->logic=LOGIC_TRUE; + return(0); case CS_SOCKET_WRITE: lp=getintvar(csi,*(long *)csi->ip); /* socket */ csi->ip+=4; @@ -216,6 +269,7 @@ int sbbs_t::exec_net(csi_t* csi) csi->socket_error=ERROR_VALUE; return(0); + /* FTP Functions */ case CS_FTP_LOGIN: lp=getintvar(csi,*(long *)csi->ip); /* socket */ csi->ip+=4; @@ -385,8 +439,6 @@ int sbbs_t::exec_net(csi_t* csi) } } -#define SOCK_READLINE_TIMEOUT 5 /* seconds */ - /* FTP Command/Response function */ bool sbbs_t::ftp_cmd(csi_t* csi, SOCKET sock, char* cmdsrc, char* rsp) { @@ -421,8 +473,12 @@ bool sbbs_t::ftp_cmd(csi_t* csi, SOCKET sock, char* cmdsrc, char* rsp) if(!online) return(FALSE); + if(!socket_check(sock)) + return(FALSE); + if(time(NULL)-start>SOCK_READLINE_TIMEOUT) { - lprintf("!ftp_cmd: SOCK_READLINE_TIMEOUT exceeded"); + lprintf("!ftp_cmd: SOCK_READLINE_TIMEOUT (%d) exceeded" + ,SOCK_READLINE_TIMEOUT); return(FALSE); } -- GitLab