[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)
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r25966 - in gnunet/src: exit vpn,
gnunet <=