aboutsummaryrefslogtreecommitdiff
path: root/src
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
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')
-rw-r--r--src/exit/gnunet-helper-exit-windows.c48
-rw-r--r--src/vpn/gnunet-helper-vpn-windows.c48
2 files changed, 54 insertions, 42 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)
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)