-- Leo's gemini proxy

-- Connecting to git.thebackupbox.net:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini

repo: urcd
action: commit
revision:
path_from:
revision_from: 172a180d5f11a6c64d9981e4b5a1c65663556cf4:
path_to:
revision_to:

git.thebackupbox.net

urcd

git://git.thebackupbox.net/urcd

commit 172a180d5f11a6c64d9981e4b5a1c65663556cf4
Author: root <root@d3v11.ano>
Date:   Fri Feb 1 23:36:47 2013 +0000

    [urcd][ucspi-stream.c] reliability (no stream corruption) (thanks SRN)

diff --git a/src/ucspi-stream.c b/src/ucspi-stream.c

index abb13c9fa633d457e06fcc157cf822a59c91c77a..

index ..a594957bb4374a58374ffe32d09a63bcf2af01ae 100644

--- a/src/ucspi-stream.c
+++ b/src/ucspi-stream.c
@@ -1,57 +1,62 @@
 #include <sys/fcntl.h>
 #include <poll.h>
 int main(){
-int TTL = 0;

 fcntl(0,4,2050);
 fcntl(1,4,2050);
 fcntl(6,4,2050);
 fcntl(7,4,2050);

-struct pollfd fds[4];
-  fds[0].fd=0       ;
-  fds[0].events=3   ;
-  fds[0].revents=3  ;
-
-  fds[1].fd=6       ;
-  fds[1].events=3   ;
-  fds[1].revents=3  ;
-
-  fds[2].fd=1       ;
-  fds[2].events=4   ;
-  fds[2].revents=4  ;
+int in = 0;
+int out = 0;
+int ttl = 0;

-  fds[3].fd=7       ;
-  fds[3].events=4   ;
-  fds[3].revents=4  ;
-
-unsigned char buffer[2048]={0};
-
-while (TTL<256){
+struct pollfd fds[4];
+fds[0].fd = 0;
+fds[0].events = 3;
+fds[0].revents = 3;
+fds[1].fd = 6;
+fds[1].events = 3;
+fds[1].revents = 3;
+fds[2].fd = 1;
+fds[2].events = 4;
+fds[2].revents = 4;
+fds[3].fd = 7;
+fds[3].events = 4;
+fds[3].revents = 4;
+
+unsigned char client_buffer[1024] = {0};
+unsigned char server_buffer[1024] = {0};
+int client_eagain = 0;
+int server_eagain = 0;
+
+while (ttl<256){
   if (poll(&fds[0],1,128-(poll(&fds[1],1,0)*128))>0){
-    if (poll(&fds[3],1,TTL)>0){
-      if (write(7,buffer,read(0,buffer,1024))<1){
-        break;
-      }
-      bzero(buffer,2048);
-      if (TTL>0){
-        --TTL;
-      }
-    }
-    else {++TTL;}
-  }
+    if (poll(&fds[3],1,ttl)>0){
+      if (server_eagain<1024){
+        in = read(0,&server_buffer[server_eagain],1024-server_eagain);
+        if (in<1) break;}
+      else in = 0;
+      out = write(7,server_buffer,server_eagain+in);
+      if (out<0) break;
+      if (out<server_eagain+in){
+        memmove(server_buffer,&server_buffer[out],out-server_eagain+in);
+        server_eagain = server_eagain + in - out;}
+      else server_eagain = 0;
+      if (ttl>0) --ttl;
+    else ++ttl;}}

   if (poll(&fds[1],1,128-(poll(&fds[0],1,0)*128))>0){
-    if (poll(&fds[2],1,TTL)>0){
-      if (write(1,buffer,read(6,buffer,1024))<1){
-        break;
-      }
-      bzero(buffer,2048);
-      if (TTL>0){
-        --TTL;
-      }
-    }
-    else {++TTL;}
-  }
-}
-exit(0);}
+    if (poll(&fds[2],1,ttl)>0){
+      if (client_eagain<1024){
+        in = read(6,&client_buffer[client_eagain],1024-client_eagain);
+        if (in<1) break;}
+      else in = 0;
+      out = write(1,client_buffer,client_eagain+in);
+      if (out<0) break;
+      if (out<client_eagain+in){
+        memmove(client_buffer,&client_buffer[out],out-client_eagain+in);
+        client_eagain = client_eagain + in - out;}
+      else client_eagain = 0;
+      if (ttl>0) --ttl;
+    else ++ttl;}}}}

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

-- Response ended

-- Page fetched on Sun Jun 2 16:24:08 2024