repo: tlswrap
action: commit
revision: 
path_from: 
revision_from: 748dc7bcd1d23499b964515c172bcbcb7b801850:
path_to: 
revision_to: 
git.thebackupbox.net
tlswrap
git clone git://git.thebackupbox.net/tlswrap
commit 748dc7bcd1d23499b964515c172bcbcb7b801850
Author: epoch 
Date:   Tue Mar 8 14:19:07 2022 +0000

    more logging from write error checks, not doing continue anymore so everything select finds get done

diff --git a/tlswrap.c b/tlswrap.c
index 065dfbb4fbb719650df1abdee249716476c58cea..
index ..0310e300e466e6612caa74c3e41fd8176f082f26 100644
--- a/tlswrap.c
+++ b/tlswrap.c
@@ -271,38 +271,48 @@ int main(int argc,char *argv[]) {
   close(b[1]);
   close(c[1]);
   syslog(LOG_DAEMON|LOG_DEBUG,"entering select loop");
-  for(;FD_ISSET(b[0],&master) && FD_ISSET(c[0],&master);) { //a select() brick that reads from ssl and writes to subprocess and reads from subprocess and writes to ssl
+  for(;FD_ISSET(b[0],&master) || FD_ISSET(c[0],&master);) { //a select() brick that reads from ssl and writes to subprocess and reads from subprocess and writes to ssl
     readfs=master;
     if((j=select(fdmax+1,&readfs,0,0,tout)) == -1 ) {
       syslog(LOG_DAEMON|LOG_ERR,"giving up. error'd in select");
       break;
     }
     if(FD_ISSET(0,&readfs)) {
-      if(SSL_read_ex(ssl,buffer,sizeof(buffer),&r) <= 0) {
-        syslog(LOG_DAEMON|LOG_DEBUG,"SSL done.");
-	FD_CLR(0,&master);
-        continue;
+      if((r=SSL_read(ssl,buffer,sizeof(buffer))) <= 0) {
+        syslog(LOG_DAEMON|LOG_ERR,"SSL done. %d msg: %s",r,ERR_error_string(ERR_get_error(),NULL));
+	if(r > 0) {//we can get done and data at the same time I guess?
+          if(write(a[1],buffer,r) < 0) {
+            syslog(LOG_DAEMON|LOG_ERR,"write failed. -_-");
+	  }
+	}
+        FD_CLR(0,&master);
+      } else {
+        syslog(LOG_DAEMON|LOG_ERR,"SSL read? %d msg: %s",r,ERR_error_string(ERR_get_error(),NULL));
+        syslog(LOG_DAEMON|LOG_DEBUG,"read %d bytes from ssl!",r);
+        if(write(a[1],buffer,r) < 0) {
+          syslog(LOG_DAEMON|LOG_ERR,"a write failed. -_-");
+        }
       }
-      syslog(LOG_DAEMON|LOG_DEBUG,"read %d bytes from ssl!",r);
-      write(a[1],buffer,r);
     }
     if(FD_ISSET(b[0],&readfs)) {
       if((r2=read(b[0],buffer,sizeof(buffer))) <= 0) {
         syslog(LOG_DAEMON|LOG_DEBUG,"subprocess stdout done.");
-	FD_CLR(b[0],&master);
-	continue;
+        FD_CLR(b[0],&master);
+      } else {
+        syslog(LOG_DAEMON|LOG_DEBUG,"read %d bytes from subprocess!",r2);
+        while(SSL_write(ssl,buffer,r2) <= 0) {
+          syslog(LOG_DAEMON|LOG_ERR,"SSL_write had an error: %s",ERR_error_string(ERR_get_error(),NULL));
+        }
       }
-      syslog(LOG_DAEMON|LOG_DEBUG,"read %d bytes from subprocess!",r2);
-      SSL_write(ssl,buffer,r2);
     }
     if(FD_ISSET(c[0],&readfs)) {
       if((r2=read(c[0],buffer,sizeof(buffer)-1)) <= 0) {
         syslog(LOG_DAEMON|LOG_DEBUG,"subprocess stderr done.");
-	FD_CLR(c[0],&master);
-        continue;
+        FD_CLR(c[0],&master);
+      } else {
+        buffer[r2]=0;//gotta null this off sice we're passing to something that expects a string.
+        syslog(LOG_DAEMON|LOG_WARNING,"%s -> %s stderr: %s",ru,su,buffer);
       }
-      buffer[r2]=0;//gotta null this off sice we're passing to something that expects a string.
-      syslog(LOG_DAEMON|LOG_WARNING,"%s -> %s stderr: %s",ru,su,buffer);
     }
   }
   SSL_shutdown(ssl);

-----END OF PAGE-----