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/exit | |
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/exit')
-rw-r--r-- | src/exit/gnunet-helper-exit-windows.c | 48 |
1 files changed, 27 insertions, 21 deletions
diff --git a/src/exit/gnunet-helper-exit-windows.c b/src/exit/gnunet-helper-exit-windows.c index 65c8bfc86..0da3c9b69 100644 --- a/src/exit/gnunet-helper-exit-windows.c +++ b/src/exit/gnunet-helper-exit-windows.c | |||
@@ -208,6 +208,11 @@ struct io_facility | |||
208 | * Amount of data actually written or read by readfile/writefile. | 208 | * Amount of data actually written or read by readfile/writefile. |
209 | */ | 209 | */ |
210 | DWORD buffer_size_processed; | 210 | DWORD buffer_size_processed; |
211 | |||
212 | /** | ||
213 | * How much of this buffer we have written in total | ||
214 | */ | ||
215 | DWORD buffer_size_written; | ||
211 | }; | 216 | }; |
212 | 217 | ||
213 | /** | 218 | /** |
@@ -1194,37 +1199,36 @@ static BOOL | |||
1194 | attempt_write (struct io_facility * output_facility, | 1199 | attempt_write (struct io_facility * output_facility, |
1195 | struct io_facility * input_facility) | 1200 | struct io_facility * input_facility) |
1196 | { | 1201 | { |
1197 | BOOL status; | ||
1198 | |||
1199 | switch (output_facility->facility_state) | 1202 | switch (output_facility->facility_state) |
1200 | { | 1203 | { |
1201 | case IOSTATE_READY: | 1204 | case IOSTATE_READY: |
1202 | 1205 | output_facility->buffer_size_written = 0; | |
1206 | |||
1207 | continue_partial_write: | ||
1203 | if (! ResetEvent (output_facility->overlapped.hEvent)) | 1208 | if (! ResetEvent (output_facility->overlapped.hEvent)) |
1204 | return FALSE; | 1209 | return FALSE; |
1205 | 1210 | ||
1206 | output_facility->buffer_size_processed = 0; | ||
1207 | status = WriteFile (output_facility->handle, | ||
1208 | output_facility->buffer, | ||
1209 | output_facility->buffer_size, | ||
1210 | &output_facility->buffer_size_processed, | ||
1211 | &output_facility->overlapped); | ||
1212 | |||
1213 | /* Check how the task was handled */ | 1211 | /* Check how the task was handled */ |
1214 | if (status && | 1212 | if (WriteFile (output_facility->handle, |
1215 | output_facility->buffer_size_processed == output_facility->buffer_size) | 1213 | output_facility->buffer + output_facility->buffer_size_written, |
1214 | output_facility->buffer_size - output_facility->buffer_size_written, | ||
1215 | &output_facility->buffer_size_processed, | ||
1216 | &output_facility->overlapped)) | ||
1216 | {/* async event processed immediately*/ | 1217 | {/* async event processed immediately*/ |
1217 | 1218 | ||
1218 | fprintf (stderr, "DEBUG: write succeeded immediately\n"); | 1219 | fprintf (stderr, "DEBUG: write succeeded immediately\n"); |
1220 | output_facility->buffer_size_written += output_facility->buffer_size_processed; | ||
1219 | 1221 | ||
1220 | /* reset event manually*/ | 1222 | /* reset event manually*/ |
1221 | if (! SetEvent (output_facility->overlapped.hEvent)) | 1223 | if (! SetEvent (output_facility->overlapped.hEvent)) |
1222 | return FALSE; | 1224 | return FALSE; |
1223 | 1225 | ||
1226 | /* partial write */ | ||
1227 | if (output_facility->buffer_size_written < output_facility->buffer_size) | ||
1228 | goto continue_partial_write; | ||
1229 | |||
1224 | /* we are now waiting for our buffer to be filled*/ | 1230 | /* we are now waiting for our buffer to be filled*/ |
1225 | output_facility->facility_state = IOSTATE_WAITING; | 1231 | output_facility->facility_state = IOSTATE_WAITING; |
1226 | output_facility->buffer_size = 0; | ||
1227 | output_facility->buffer_size_processed = 0; | ||
1228 | 1232 | ||
1229 | /* we successfully wrote something and now need to reset our reader */ | 1233 | /* we successfully wrote something and now need to reset our reader */ |
1230 | if (IOSTATE_WAITING == input_facility->facility_state) | 1234 | if (IOSTATE_WAITING == input_facility->facility_state) |
@@ -1249,22 +1253,24 @@ attempt_write (struct io_facility * output_facility, | |||
1249 | return TRUE; | 1253 | return TRUE; |
1250 | case IOSTATE_QUEUED: | 1254 | case IOSTATE_QUEUED: |
1251 | // there was an operation going on already, check if that has completed now. | 1255 | // there was an operation going on already, check if that has completed now. |
1252 | status = GetOverlappedResult (output_facility->handle, | 1256 | |
1257 | if (GetOverlappedResult (output_facility->handle, | ||
1253 | &output_facility->overlapped, | 1258 | &output_facility->overlapped, |
1254 | &output_facility->buffer_size_processed, | 1259 | &output_facility->buffer_size_processed, |
1255 | FALSE); | 1260 | FALSE)) |
1256 | if (status && | ||
1257 | output_facility->buffer_size_processed == output_facility->buffer_size) | ||
1258 | {/* successful return for a queued operation */ | 1261 | {/* successful return for a queued operation */ |
1259 | if (! ResetEvent (output_facility->overlapped.hEvent)) | 1262 | if (! ResetEvent (output_facility->overlapped.hEvent)) |
1260 | return FALSE; | 1263 | return FALSE; |
1261 | 1264 | ||
1262 | fprintf (stderr, "DEBUG: write succeeded delayed\n"); | 1265 | fprintf (stderr, "DEBUG: write succeeded delayed\n"); |
1263 | 1266 | output_facility->buffer_size_written += output_facility->buffer_size_processed; | |
1267 | |||
1268 | /* partial write */ | ||
1269 | if (output_facility->buffer_size_written < output_facility->buffer_size) | ||
1270 | goto continue_partial_write; | ||
1271 | |||
1264 | /* we are now waiting for our buffer to be filled*/ | 1272 | /* we are now waiting for our buffer to be filled*/ |
1265 | output_facility->facility_state = IOSTATE_WAITING; | 1273 | output_facility->facility_state = IOSTATE_WAITING; |
1266 | output_facility->buffer_size = 0; | ||
1267 | output_facility->buffer_size_processed = 0; | ||
1268 | 1274 | ||
1269 | /* we successfully wrote something and now need to reset our reader */ | 1275 | /* we successfully wrote something and now need to reset our reader */ |
1270 | if (IOSTATE_WAITING == input_facility->facility_state) | 1276 | if (IOSTATE_WAITING == input_facility->facility_state) |