[glib] GSocket: Add function to get the currently available bytes for reading



commit fbdb8128dce3ef013640c7142888a76f56a7f0f8
Author: Ole Andrà Vadla RavnÃs <oravnas cisco com>
Date:   Mon Jan 16 14:00:49 2012 +0100

    GSocket: Add function to get the currently available bytes for reading
    
    https://bugzilla.gnome.org/show_bug.cgi?id=668009

 docs/reference/gio/gio-sections.txt |    1 +
 gio/gio.symbols                     |    1 +
 gio/gsocket.c                       |   34 ++++++++++++++++++++++++++++++++++
 gio/gsocket.h                       |    2 ++
 4 files changed, 38 insertions(+), 0 deletions(-)
---
diff --git a/docs/reference/gio/gio-sections.txt b/docs/reference/gio/gio-sections.txt
index 3da75ef..96b8b32 100644
--- a/docs/reference/gio/gio-sections.txt
+++ b/docs/reference/gio/gio-sections.txt
@@ -1806,6 +1806,7 @@ g_socket_is_connected
 g_socket_create_source
 g_socket_condition_check
 g_socket_condition_wait
+g_socket_get_available_bytes
 g_socket_set_listen_backlog
 g_socket_get_listen_backlog
 g_socket_get_blocking
diff --git a/gio/gio.symbols b/gio/gio.symbols
index d1e3ff8..94391d5 100644
--- a/gio/gio.symbols
+++ b/gio/gio.symbols
@@ -949,6 +949,7 @@ g_socket_condition_check
 g_socket_condition_wait
 g_socket_connect
 g_socket_create_source
+g_socket_get_available_bytes
 g_socket_get_blocking
 g_socket_get_broadcast
 g_socket_get_family
diff --git a/gio/gsocket.c b/gio/gsocket.c
index 196c842..d985e9e 100644
--- a/gio/gsocket.c
+++ b/gio/gsocket.c
@@ -41,6 +41,7 @@
 #ifndef G_OS_WIN32
 # include <fcntl.h>
 # include <unistd.h>
+# include <sys/ioctl.h>
 #endif
 
 #ifdef HAVE_SYS_UIO_H
@@ -2336,6 +2337,39 @@ g_socket_check_connect_result (GSocket  *socket,
 }
 
 /**
+ * g_socket_get_available_bytes:
+ * @socket: a #GSocket
+ *
+ * Get the amount of data pending in the OS input buffer.
+ *
+ * Returns: the number of bytes that can be read from the socket
+ * without blocking or -1 on error.
+ *
+ * Since: 2.32
+ */
+gssize
+g_socket_get_available_bytes (GSocket *socket)
+{
+#ifndef G_OS_WIN32
+  gulong avail = 0;
+#else
+  gint avail = 0;
+#endif
+
+  g_return_val_if_fail (G_IS_SOCKET (socket), -1);
+
+#ifndef G_OS_WIN32
+  if (ioctl (socket->priv->fd, FIONREAD, &avail) < 0)
+    return -1;
+#else
+  if (ioctlsocket (socket->priv->fd, FIONREAD, &avail) == SOCKET_ERROR)
+    return -1;
+#endif
+
+  return avail;
+}
+
+/**
  * g_socket_receive:
  * @socket: a #GSocket
  * @buffer: a buffer to read data into (which should be at least @size
diff --git a/gio/gsocket.h b/gio/gsocket.h
index 94b4ce1..ae7673c 100644
--- a/gio/gsocket.h
+++ b/gio/gsocket.h
@@ -137,6 +137,8 @@ gboolean               g_socket_connect                 (GSocket
 gboolean               g_socket_check_connect_result    (GSocket                 *socket,
 							 GError                 **error);
 
+gssize                 g_socket_get_available_bytes     (GSocket                 *socket);
+
 GIOCondition           g_socket_condition_check         (GSocket                 *socket,
 							 GIOCondition             condition);
 gboolean               g_socket_condition_wait          (GSocket                 *socket,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]