Mercurial > pidgin.yaz
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) {