From: Jean-Marc Pigeon (Delson) Date: Sun, 30 Mar 2025 20:04:06 +0000 (-0400) Subject: Improved soc_received procedure X-Git-Tag: tag-0.7~45 X-Git-Url: https://jmp-git.ovh.safe.ca/?a=commitdiff_plain;h=b7c93edc7f7705e94a92c28cf0e7ec128e9a7ca9;p=jmp%2Fmailleur Improved soc_received procedure --- diff --git a/lib/devsoc.c b/lib/devsoc.c index 0581523..caa23ff 100644 --- a/lib/devsoc.c +++ b/lib/devsoc.c @@ -1043,69 +1043,88 @@ PUBLIC int soc_receive(SOCPTR *socptr) int got; SOCTYP *soc; +int limit; +char *buffer; +int phase; +_Bool proceed; got=0; soc=(SOCTYP *)socptr; -if (soc!=(SOCTYP *)0) { - int limit; - char *buffer; - - buffer=soc->carpile+soc->carin; - limit=(soc->maxcarin-soc->carin); - (void) memset(buffer,'\000',limit); - limit--; - switch (soc->modtls) { - case true : - got=tls_read(soc->tls,buffer,limit); +limit=0; +buffer=(char *)0; +phase=0; +proceed=true; +while (proceed==true) { + //(void) rou_alert(0,"JMPDBG %s phase='%d'",OPEP,phase); + switch (phase) { + case 0 : //is socket available + if (soc==(SOCTYP *)0) { + (void) rou_alert(0,"%s socket pointer is null (Bug?)",OPEP); + phase=999; //No need to go further + } break; - case false : - got=recv(soc->handle,buffer,limit,MSG_DONTWAIT); - (void) rou_alert(0,"%s, got=%d char",OPEP,got); + case 1 : //Is the socket conneted + if (soc->connected==false) { + (void) rou_alert(0,"%s socket Already disconnect",OPEP); + phase=999; //No need to go further + } + break; + case 2 : //reading data + buffer=soc->carpile+soc->carin; + limit=(soc->maxcarin-soc->carin); + (void) memset(buffer,'\000',limit); + limit--; + switch (soc->modtls) { + case true : + got=tls_read(soc->tls,buffer,limit); + break; + case false : + got=recv(soc->handle,buffer,limit,MSG_DONTWAIT); + break; + } + (void) rou_alert(0,"%s, JMPDBG got=%d char buffer=<%s>",OPEP,got,buffer); + break; + case 3 : //check about recieved data switch (got) { case -1 : //do not block if (errno==EWOULDBLOCK) errno=EAGAIN; switch (errno) { - case EAGAIN : //no char available yet + case EAGAIN : //no char available yet break; - case ECONNRESET : //Connection reset by peer - (void) rou_alert(0,"%s JMPDBG connection reset by peer",OPEP); + case ECONNRESET : //Connection reset by peer + (void) rou_alert(0,"%s connection reset by peer",OPEP); break; default : - foreground=false; //JMPDBG? (void) rou_alert(0,"%s Unexpected error=%d <%s> (Bug)", OPEP,errno,strerror(errno)); - (void) exit(1); //JMPDBG! break; } break; - case 0 : //Premature EOF? + case 0 : //No char available? (void) rou_alert(0,"%s, detected EOF error=<%s:%d>", OPEP,strerror(errno),errno); - if (close(soc->handle)<0) { + if (close(soc->handle)<0) (void) rou_alert(0,"%s, after close error=<%s:%d>", OPEP,strerror(errno),errno); - } - soc->handle=-1; + soc->handle=-1; //Socket is now disconnected soc->connected=false; break; default : //we got some char from remote + for (int i=0;icarin+=got; //managing carpile + soc->carpile[soc->carin]='\000'; break; } break; + default : //SAFE Guard + proceed=false; + break; } - if (got>0) { //we have recived some character - char *ptr; - - //removing NULL char if received - ptr=buffer; - for (int i=0;icarin+=got; //managing carpile - soc->carpile[soc->carin]='\000'; - } + phase++; } return got; #undef OPEP diff --git a/lib/subrou.c b/lib/subrou.c index eb0b687..86016a0 100644 --- a/lib/subrou.c +++ b/lib/subrou.c @@ -21,7 +21,7 @@ //version definition #define VERSION "0.6" -#define RELEASE "29" +#define RELEASE "30" //Public variables PUBLIC int debug=0; //debug level