diff options
author | Evan Schoenberg <evands@pidgin.im> | 2007-02-23 05:17:20 +0000 |
---|---|---|
committer | Evan Schoenberg <evands@pidgin.im> | 2007-02-23 05:17:20 +0000 |
commit | 06256b5996190daecd799cb7aa97c667520bdd7f (patch) | |
tree | 86c752fbf6cd0b7d3c541033b4a6b995eb112ac1 /libpurple/eventloop.c | |
parent | 11d2691d30e3ee88cf2fa852ad89f5cac7078d92 (diff) | |
download | pidgin-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.c | 22 |
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) { |