aboutsummaryrefslogtreecommitdiff
path: root/src/vpn
diff options
context:
space:
mode:
authorChristian Fuchs <christian.fuchs@cfuchs.net>2013-01-31 13:12:06 +0000
committerChristian Fuchs <christian.fuchs@cfuchs.net>2013-01-31 13:12:06 +0000
commit328b1ac9a1b40d6963e454183af2bf2e5019d286 (patch)
treef87fa4830ab60be935a2f04c7ca21331cd78a48f /src/vpn
parentf8358e6f83f34dc5dc69b30bc34f7546c575b74f (diff)
downloadgnunet-328b1ac9a1b40d6963e454183af2bf2e5019d286.tar.gz
gnunet-328b1ac9a1b40d6963e454183af2bf2e5019d286.zip
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.
Diffstat (limited to 'src/vpn')
-rw-r--r--src/vpn/gnunet-helper-vpn-windows.c48
1 files changed, 27 insertions, 21 deletions
diff --git a/src/vpn/gnunet-helper-vpn-windows.c b/src/vpn/gnunet-helper-vpn-windows.c
index bd364ec7e..b810dc706 100644
--- a/src/vpn/gnunet-helper-vpn-windows.c
+++ b/src/vpn/gnunet-helper-vpn-windows.c
@@ -221,6 +221,11 @@ struct io_facility
221 * Amount of data actually written or read by readfile/writefile. 221 * Amount of data actually written or read by readfile/writefile.
222 */ 222 */
223 DWORD buffer_size_processed; 223 DWORD buffer_size_processed;
224
225 /**
226 * How much of this buffer we have writte in total
227 */
228 DWORD buffer_size_written;
224}; 229};
225 230
226/** 231/**
@@ -1207,37 +1212,36 @@ static BOOL
1207attempt_write (struct io_facility * output_facility, 1212attempt_write (struct io_facility * output_facility,
1208 struct io_facility * input_facility) 1213 struct io_facility * input_facility)
1209{ 1214{
1210 BOOL status;
1211
1212 switch (output_facility->facility_state) 1215 switch (output_facility->facility_state)
1213 { 1216 {
1214 case IOSTATE_READY: 1217 case IOSTATE_READY:
1215 1218 output_facility->buffer_size_written = 0;
1219
1220continue_partial_write:
1216 if (! ResetEvent (output_facility->overlapped.hEvent)) 1221 if (! ResetEvent (output_facility->overlapped.hEvent))
1217 return FALSE; 1222 return FALSE;
1218 1223
1219 output_facility->buffer_size_processed = 0;
1220 status = WriteFile (output_facility->handle,
1221 output_facility->buffer,
1222 output_facility->buffer_size,
1223 &output_facility->buffer_size_processed,
1224 &output_facility->overlapped);
1225
1226 /* Check how the task was handled */ 1224 /* Check how the task was handled */
1227 if (status && 1225 if (WriteFile (output_facility->handle,
1228 output_facility->buffer_size_processed == output_facility->buffer_size) 1226 output_facility->buffer + output_facility->buffer_size_written,
1227 output_facility->buffer_size - output_facility->buffer_size_written,
1228 &output_facility->buffer_size_processed,
1229 &output_facility->overlapped))
1229 {/* async event processed immediately*/ 1230 {/* async event processed immediately*/
1230 1231
1231 fprintf (stderr, "DEBUG: write succeeded immediately\n"); 1232 fprintf (stderr, "DEBUG: write succeeded immediately\n");
1233 output_facility->buffer_size_written += output_facility->buffer_size_processed;
1232 1234
1233 /* reset event manually*/ 1235 /* reset event manually*/
1234 if (! SetEvent (output_facility->overlapped.hEvent)) 1236 if (! SetEvent (output_facility->overlapped.hEvent))
1235 return FALSE; 1237 return FALSE;
1236 1238
1239 /* partial write */
1240 if (output_facility->buffer_size_written < output_facility->buffer_size)
1241 goto continue_partial_write;
1242
1237 /* we are now waiting for our buffer to be filled*/ 1243 /* we are now waiting for our buffer to be filled*/
1238 output_facility->facility_state = IOSTATE_WAITING; 1244 output_facility->facility_state = IOSTATE_WAITING;
1239 output_facility->buffer_size = 0;
1240 output_facility->buffer_size_processed = 0;
1241 1245
1242 /* we successfully wrote something and now need to reset our reader */ 1246 /* we successfully wrote something and now need to reset our reader */
1243 if (IOSTATE_WAITING == input_facility->facility_state) 1247 if (IOSTATE_WAITING == input_facility->facility_state)
@@ -1262,22 +1266,24 @@ attempt_write (struct io_facility * output_facility,
1262 return TRUE; 1266 return TRUE;
1263 case IOSTATE_QUEUED: 1267 case IOSTATE_QUEUED:
1264 // there was an operation going on already, check if that has completed now. 1268 // there was an operation going on already, check if that has completed now.
1265 status = GetOverlappedResult (output_facility->handle, 1269
1270 if (GetOverlappedResult (output_facility->handle,
1266 &output_facility->overlapped, 1271 &output_facility->overlapped,
1267 &output_facility->buffer_size_processed, 1272 &output_facility->buffer_size_processed,
1268 FALSE); 1273 FALSE))
1269 if (status &&
1270 output_facility->buffer_size_processed == output_facility->buffer_size)
1271 {/* successful return for a queued operation */ 1274 {/* successful return for a queued operation */
1272 if (! ResetEvent (output_facility->overlapped.hEvent)) 1275 if (! ResetEvent (output_facility->overlapped.hEvent))
1273 return FALSE; 1276 return FALSE;
1274 1277
1275 fprintf (stderr, "DEBUG: write succeeded delayed\n"); 1278 fprintf (stderr, "DEBUG: write succeeded delayed\n");
1276 1279 output_facility->buffer_size_written += output_facility->buffer_size_processed;
1280
1281 /* partial write */
1282 if (output_facility->buffer_size_written < output_facility->buffer_size)
1283 goto continue_partial_write;
1284
1277 /* we are now waiting for our buffer to be filled*/ 1285 /* we are now waiting for our buffer to be filled*/
1278 output_facility->facility_state = IOSTATE_WAITING; 1286 output_facility->facility_state = IOSTATE_WAITING;
1279 output_facility->buffer_size = 0;
1280 output_facility->buffer_size_processed = 0;
1281 1287
1282 /* we successfully wrote something and now need to reset our reader */ 1288 /* we successfully wrote something and now need to reset our reader */
1283 if (IOSTATE_WAITING == input_facility->facility_state) 1289 if (IOSTATE_WAITING == input_facility->facility_state)