aboutsummaryrefslogtreecommitdiff
path: root/src/util/network.c
diff options
context:
space:
mode:
authorNathan S. Evans <evans@in.tum.de>2010-01-19 13:23:04 +0000
committerNathan S. Evans <evans@in.tum.de>2010-01-19 13:23:04 +0000
commit71c69f178dd8ad00e917c8724c4f2417f8d9648f (patch)
treef2d68f75774acfc311f26b2a657dedc3be3e3ece /src/util/network.c
parent691f0bfb0a1cbd2a862c4707c40b35aba13c92f1 (diff)
downloadgnunet-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.c62
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 */
363unsigned int
364GNUNET_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 */
389ssize_t
390GNUNET_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
702int
703GNUNET_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 *