diff libpurple/eventloop.c @ 15682:14d85ee22d78

Added a new GaimEventLoopUiOps item, input_get_error(). This function allows the UI to return the current error status on a socket/input. If the UI does not implement it (as Pidgin and gntgaim do not, since glib's handling of sockets is sane), it is just a wrapper around getsockopt(). Implemented or not, its return values should match those of getsockopt() with a level of SOL_SOCKET and an option of SO_ERROR. For curious souls, Adium will be using this to provide a working version of getsockopt(); the CoreFoundation CFSocket class which is used for socket read/write calls getsockopt() with SO_ERROR itself, thereby clearing the error flag [as documented in getsockopt()'s behavior], so depending upon it for determining if an error occurred leads to significant misbehavior.
author Evan Schoenberg <evan.s@dreskin.net>
date Fri, 23 Feb 2007 05:17:20 +0000
parents d44fca5248a1
children 562eaef05fe5
line wrap: on
line diff
--- a/libpurple/eventloop.c	Fri Feb 23 05:12:54 2007 +0000
+++ b/libpurple/eventloop.c	Fri Feb 23 05:17:20 2007 +0000
@@ -23,6 +23,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 #include "eventloop.h"
+#include "internal.h"
 
 static GaimEventLoopUiOps *eventloop_ui_ops = NULL;
 
@@ -58,6 +59,27 @@
 	return ops->input_remove(tag);
 }
 
+int
+gaim_input_get_error(int fd, int *error)
+{
+	GaimEventLoopUiOps *ops = gaim_eventloop_get_ui_ops();
+
+	if (ops->input_get_error)
+	{
+		errno = 0;
+		int ret = ops->input_get_error(fd, error);
+		errno = *error;
+		return ret;
+	}
+	else
+	{
+		socklen_t len;
+		len = sizeof(*error);
+
+		return getsockopt(fd, SOL_SOCKET, SO_ERROR, error, &len);
+	}
+}
+
 void
 gaim_eventloop_set_ui_ops(GaimEventLoopUiOps *ops)
 {