From: Ole André Vadla Ravnås Date: Mon, 16 Jan 2012 13:00:49 +0000 (+0100) Subject: GSocket: Add function to get the currently available bytes for reading X-Git-Tag: 2.31.10~6 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fbdb8128dce3ef013640c7142888a76f56a7f0f8;p=platform%2Fupstream%2Fglib.git GSocket: Add function to get the currently available bytes for reading https://bugzilla.gnome.org/show_bug.cgi?id=668009 --- 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 # include +# include #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,