diff options
author | Christian Fuchs <christian.fuchs@cfuchs.net> | 2013-01-31 13:12:06 +0000 |
---|---|---|
committer | Christian Fuchs <christian.fuchs@cfuchs.net> | 2013-01-31 13:12:06 +0000 |
commit | 328b1ac9a1b40d6963e454183af2bf2e5019d286 (patch) | |
tree | f87fa4830ab60be935a2f04c7ca21331cd78a48f /src/vpn/gnunet-helper-vpn-windows.c | |
parent | f8358e6f83f34dc5dc69b30bc34f7546c575b74f (diff) | |
download | gnunet-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/gnunet-helper-vpn-windows.c')
-rw-r--r-- | src/vpn/gnunet-helper-vpn-windows.c | 48 |
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 | |||
1207 | attempt_write (struct io_facility * output_facility, | 1212 | attempt_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 | |||
1220 | continue_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) |