gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r25966 - in gnunet/src: exit vpn


From: gnunet
Subject: [GNUnet-SVN] r25966 - in gnunet/src: exit vpn
Date: Thu, 31 Jan 2013 14:12:06 +0100

Author: cfuchs
Date: 2013-01-31 14:12:06 +0100 (Thu, 31 Jan 2013)
New Revision: 25966

Modified:
   gnunet/src/exit/gnunet-helper-exit-windows.c
   gnunet/src/vpn/gnunet-helper-vpn-windows.c
Log:
added support for partial write to stdin/stdout.

there seems to be no point in adding support for partial read from the 
TAP, as there is no delimiter and we get data on a per-frame level.



Modified: gnunet/src/exit/gnunet-helper-exit-windows.c
===================================================================
--- gnunet/src/exit/gnunet-helper-exit-windows.c        2013-01-31 12:46:07 UTC 
(rev 25965)
+++ gnunet/src/exit/gnunet-helper-exit-windows.c        2013-01-31 13:12:06 UTC 
(rev 25966)
@@ -208,6 +208,11 @@
    * Amount of data actually written or read by readfile/writefile.
    */
   DWORD buffer_size_processed;
+  
+  /**
+   * How much of this buffer we have written in total
+   */
+  DWORD buffer_size_written;
 };
 
 /**
@@ -1194,37 +1199,36 @@
 attempt_write (struct io_facility * output_facility,
                struct io_facility * input_facility)
 {
-  BOOL status;
-
   switch (output_facility->facility_state)
     {
     case IOSTATE_READY:
-
+      output_facility->buffer_size_written = 0;
+      
+continue_partial_write:
       if (! ResetEvent (output_facility->overlapped.hEvent))
         return FALSE;
 
-      output_facility->buffer_size_processed = 0;
-      status = WriteFile (output_facility->handle,
-                          output_facility->buffer,
-                          output_facility->buffer_size,
+      /* Check how the task was handled */
+      if (WriteFile (output_facility->handle,
+                          output_facility->buffer + 
output_facility->buffer_size_written,
+                          output_facility->buffer_size - 
output_facility->buffer_size_written,
                           &output_facility->buffer_size_processed,
-                          &output_facility->overlapped);
-
-      /* Check how the task was handled */
-      if (status &&
-          output_facility->buffer_size_processed == 
output_facility->buffer_size)
+                          &output_facility->overlapped))
         {/* async event processed immediately*/
 
           fprintf (stderr, "DEBUG: write succeeded immediately\n");
+          output_facility->buffer_size_written += 
output_facility->buffer_size_processed;
           
           /* reset event manually*/
           if (! SetEvent (output_facility->overlapped.hEvent))
             return FALSE;
 
+          /* partial write */
+          if (output_facility->buffer_size_written < 
output_facility->buffer_size)
+            goto continue_partial_write;
+          
           /* we are now waiting for our buffer to be filled*/
           output_facility->facility_state = IOSTATE_WAITING;
-          output_facility->buffer_size = 0;
-          output_facility->buffer_size_processed = 0;
 
           /* we successfully wrote something and now need to reset our reader 
*/
           if (IOSTATE_WAITING == input_facility->facility_state)
@@ -1249,22 +1253,24 @@
       return TRUE;
     case IOSTATE_QUEUED:
       // there was an operation going on already, check if that has completed 
now.
-      status = GetOverlappedResult (output_facility->handle,
+      
+      if (GetOverlappedResult (output_facility->handle,
                                     &output_facility->overlapped,
                                     &output_facility->buffer_size_processed,
-                                    FALSE);
-      if (status &&
-          output_facility->buffer_size_processed == 
output_facility->buffer_size)
+                                    FALSE))
         {/* successful return for a queued operation */
           if (! ResetEvent (output_facility->overlapped.hEvent))
             return FALSE;
           
           fprintf (stderr, "DEBUG: write succeeded delayed\n");
-
+          output_facility->buffer_size_written += 
output_facility->buffer_size_processed;
+          
+          /* partial write */
+          if (output_facility->buffer_size_written < 
output_facility->buffer_size)
+            goto continue_partial_write;
+          
           /* we are now waiting for our buffer to be filled*/
           output_facility->facility_state = IOSTATE_WAITING;
-          output_facility->buffer_size = 0;
-          output_facility->buffer_size_processed = 0;
           
           /* we successfully wrote something and now need to reset our reader 
*/
           if (IOSTATE_WAITING == input_facility->facility_state)

Modified: gnunet/src/vpn/gnunet-helper-vpn-windows.c
===================================================================
--- gnunet/src/vpn/gnunet-helper-vpn-windows.c  2013-01-31 12:46:07 UTC (rev 
25965)
+++ gnunet/src/vpn/gnunet-helper-vpn-windows.c  2013-01-31 13:12:06 UTC (rev 
25966)
@@ -221,6 +221,11 @@
    * Amount of data actually written or read by readfile/writefile.
    */
   DWORD buffer_size_processed;
+  
+  /**
+   * How much of this buffer we have writte in total
+   */
+  DWORD buffer_size_written;
 };
 
 /**
@@ -1207,37 +1212,36 @@
 attempt_write (struct io_facility * output_facility,
                struct io_facility * input_facility)
 {
-  BOOL status;
-
   switch (output_facility->facility_state)
     {
     case IOSTATE_READY:
-
+      output_facility->buffer_size_written = 0;
+      
+continue_partial_write:
       if (! ResetEvent (output_facility->overlapped.hEvent))
         return FALSE;
 
-      output_facility->buffer_size_processed = 0;
-      status = WriteFile (output_facility->handle,
-                          output_facility->buffer,
-                          output_facility->buffer_size,
+      /* Check how the task was handled */
+      if (WriteFile (output_facility->handle,
+                          output_facility->buffer + 
output_facility->buffer_size_written,
+                          output_facility->buffer_size - 
output_facility->buffer_size_written,
                           &output_facility->buffer_size_processed,
-                          &output_facility->overlapped);
-
-      /* Check how the task was handled */
-      if (status &&
-          output_facility->buffer_size_processed == 
output_facility->buffer_size)
+                          &output_facility->overlapped))
         {/* async event processed immediately*/
 
           fprintf (stderr, "DEBUG: write succeeded immediately\n");
+          output_facility->buffer_size_written += 
output_facility->buffer_size_processed;
           
           /* reset event manually*/
           if (! SetEvent (output_facility->overlapped.hEvent))
             return FALSE;
 
+          /* partial write */
+          if (output_facility->buffer_size_written < 
output_facility->buffer_size)
+            goto continue_partial_write;
+          
           /* we are now waiting for our buffer to be filled*/
           output_facility->facility_state = IOSTATE_WAITING;
-          output_facility->buffer_size = 0;
-          output_facility->buffer_size_processed = 0;
 
           /* we successfully wrote something and now need to reset our reader 
*/
           if (IOSTATE_WAITING == input_facility->facility_state)
@@ -1262,22 +1266,24 @@
       return TRUE;
     case IOSTATE_QUEUED:
       // there was an operation going on already, check if that has completed 
now.
-      status = GetOverlappedResult (output_facility->handle,
+      
+      if (GetOverlappedResult (output_facility->handle,
                                     &output_facility->overlapped,
                                     &output_facility->buffer_size_processed,
-                                    FALSE);
-      if (status &&
-          output_facility->buffer_size_processed == 
output_facility->buffer_size)
+                                    FALSE))
         {/* successful return for a queued operation */
           if (! ResetEvent (output_facility->overlapped.hEvent))
             return FALSE;
           
           fprintf (stderr, "DEBUG: write succeeded delayed\n");
-
+          output_facility->buffer_size_written += 
output_facility->buffer_size_processed;
+          
+          /* partial write */
+          if (output_facility->buffer_size_written < 
output_facility->buffer_size)
+            goto continue_partial_write;
+          
           /* we are now waiting for our buffer to be filled*/
           output_facility->facility_state = IOSTATE_WAITING;
-          output_facility->buffer_size = 0;
-          output_facility->buffer_size_processed = 0;
           
           /* we successfully wrote something and now need to reset our reader 
*/
           if (IOSTATE_WAITING == input_facility->facility_state)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]