diff options
author | Nathan S. Evans <evans@in.tum.de> | 2010-01-19 13:23:04 +0000 |
---|---|---|
committer | Nathan S. Evans <evans@in.tum.de> | 2010-01-19 13:23:04 +0000 |
commit | 71c69f178dd8ad00e917c8724c4f2417f8d9648f (patch) | |
tree | f2d68f75774acfc311f26b2a657dedc3be3e3ece /src/util/network.c | |
parent | 691f0bfb0a1cbd2a862c4707c40b35aba13c92f1 (diff) | |
download | gnunet-71c69f178dd8ad00e917c8724c4f2417f8d9648f.tar.gz gnunet-71c69f178dd8ad00e917c8724c4f2417f8d9648f.zip |
moderate udp support, not really tested (:
Diffstat (limited to 'src/util/network.c')
-rw-r--r-- | src/util/network.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/util/network.c b/src/util/network.c index d889fa94b..398f2b51a 100644 --- a/src/util/network.c +++ b/src/util/network.c | |||
@@ -355,6 +355,62 @@ GNUNET_NETWORK_socket_listen (const struct GNUNET_NETWORK_Handle *desc, | |||
355 | 355 | ||
356 | 356 | ||
357 | /** | 357 | /** |
358 | * How much data is available to be read on this descriptor? | ||
359 | * | ||
360 | * Returns GNUNET_NO if no data is available, or on error! | ||
361 | * @param desc socket | ||
362 | */ | ||
363 | unsigned int | ||
364 | GNUNET_NETWORK_socket_recvfrom_amount (const struct GNUNET_NETWORK_Handle * desc) | ||
365 | { | ||
366 | int error; | ||
367 | unsigned int pending; | ||
368 | |||
369 | /* How much is there to be read? */ | ||
370 | error = ioctl(desc->fd, FIONREAD, &pending); | ||
371 | GNUNET_log_from(GNUNET_ERROR_TYPE_INFO, "udp", _ | ||
372 | ("pending is %u bytes, error is %d\n"), pending, error); | ||
373 | |||
374 | if (error == 0) | ||
375 | return pending; | ||
376 | else | ||
377 | return GNUNET_NO; | ||
378 | } | ||
379 | |||
380 | /** | ||
381 | * Read data from a connected socket (always non-blocking). | ||
382 | * @param desc socket | ||
383 | * @param buffer buffer | ||
384 | * @param length length of buffer | ||
385 | * @param src_addr either the source to recv from, or all zeroes | ||
386 | * to be filled in by recvfrom | ||
387 | * @param addrlen length of the addr | ||
388 | */ | ||
389 | ssize_t | ||
390 | GNUNET_NETWORK_socket_recvfrom (const struct GNUNET_NETWORK_Handle * desc, | ||
391 | void *buffer, size_t length, | ||
392 | struct sockaddr *src_addr, socklen_t *addrlen) | ||
393 | { | ||
394 | int ret; | ||
395 | int flags; | ||
396 | flags = 0; | ||
397 | |||
398 | #ifdef MSG_DONTWAIT | ||
399 | flags |= MSG_DONTWAIT; | ||
400 | |||
401 | #endif /* */ | ||
402 | ret = recvfrom (desc->fd, buffer, length, flags, src_addr, addrlen); | ||
403 | |||
404 | #ifdef MINGW | ||
405 | if (SOCKET_ERROR == ret) | ||
406 | SetErrnoFromWinsockError (WSAGetLastError ()); | ||
407 | |||
408 | #endif /* */ | ||
409 | return ret; | ||
410 | } | ||
411 | |||
412 | |||
413 | /** | ||
358 | * Read data from a connected socket (always non-blocking). | 414 | * Read data from a connected socket (always non-blocking). |
359 | * @param desc socket | 415 | * @param desc socket |
360 | * @param buffer buffer | 416 | * @param buffer buffer |
@@ -643,6 +699,12 @@ GNUNET_NETWORK_fdset_copy (struct GNUNET_NETWORK_FDSet *to, | |||
643 | #endif | 699 | #endif |
644 | } | 700 | } |
645 | 701 | ||
702 | int | ||
703 | GNUNET_NETWORK_get_fd (struct GNUNET_NETWORK_Handle *desc) | ||
704 | { | ||
705 | return desc->fd; | ||
706 | } | ||
707 | |||
646 | /** | 708 | /** |
647 | * Copy a native fd set | 709 | * Copy a native fd set |
648 | * | 710 | * |