GSocket: Add function to get the currently available bytes for reading
authorOle André Vadla Ravnås <oravnas@cisco.com>
Mon, 16 Jan 2012 13:00:49 +0000 (14:00 +0100)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Mon, 16 Jan 2012 17:41:40 +0000 (18:41 +0100)
https://bugzilla.gnome.org/show_bug.cgi?id=668009

docs/reference/gio/gio-sections.txt
gio/gio.symbols
gio/gsocket.c
gio/gsocket.h

index 3da75ef..96b8b32 100644 (file)
@@ -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
index d1e3ff8..94391d5 100644 (file)
@@ -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
index 196c842..d985e9e 100644 (file)
@@ -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
index 94b4ce1..ae7673c 100644 (file)
@@ -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,