aboutsummaryrefslogtreecommitdiff
path: root/src/exit
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/exit
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/exit')
-rw-r--r--src/exit/gnunet-helper-exit-windows.c48
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
1194attempt_write (struct io_facility * output_facility, 1199attempt_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
1207continue_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)