summaryrefslogtreecommitdiff
path: root/libpurple/eventloop.c
diff options
context:
space:
mode:
authorEvan Schoenberg <evands@pidgin.im>2007-02-23 05:17:20 +0000
committerEvan Schoenberg <evands@pidgin.im>2007-02-23 05:17:20 +0000
commit06256b5996190daecd799cb7aa97c667520bdd7f (patch)
tree86c752fbf6cd0b7d3c541033b4a6b995eb112ac1 /libpurple/eventloop.c
parent11d2691d30e3ee88cf2fa852ad89f5cac7078d92 (diff)
downloadpidgin-06256b5996190daecd799cb7aa97c667520bdd7f.tar.gz
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.
Diffstat (limited to 'libpurple/eventloop.c')
-rw-r--r--libpurple/eventloop.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/libpurple/eventloop.c b/libpurple/eventloop.c
index 05c3f1b6a1..4bb79cd6fe 100644
--- a/libpurple/eventloop.c
+++ b/libpurple/eventloop.c
@@ -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 @@ gaim_input_remove(guint tag)
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)
{