Mercurial > pidgin.yaz
comparison 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 |
comparison
equal
deleted
inserted
replaced
15681:868c9d2cb818 | 15682:14d85ee22d78 |
---|---|
21 * You should have received a copy of the GNU General Public License | 21 * You should have received a copy of the GNU General Public License |
22 * along with this program; if not, write to the Free Software | 22 * along with this program; if not, write to the Free Software |
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
24 */ | 24 */ |
25 #include "eventloop.h" | 25 #include "eventloop.h" |
26 #include "internal.h" | |
26 | 27 |
27 static GaimEventLoopUiOps *eventloop_ui_ops = NULL; | 28 static GaimEventLoopUiOps *eventloop_ui_ops = NULL; |
28 | 29 |
29 guint | 30 guint |
30 gaim_timeout_add(guint interval, GSourceFunc function, gpointer data) | 31 gaim_timeout_add(guint interval, GSourceFunc function, gpointer data) |
56 GaimEventLoopUiOps *ops = gaim_eventloop_get_ui_ops(); | 57 GaimEventLoopUiOps *ops = gaim_eventloop_get_ui_ops(); |
57 | 58 |
58 return ops->input_remove(tag); | 59 return ops->input_remove(tag); |
59 } | 60 } |
60 | 61 |
62 int | |
63 gaim_input_get_error(int fd, int *error) | |
64 { | |
65 GaimEventLoopUiOps *ops = gaim_eventloop_get_ui_ops(); | |
66 | |
67 if (ops->input_get_error) | |
68 { | |
69 errno = 0; | |
70 int ret = ops->input_get_error(fd, error); | |
71 errno = *error; | |
72 return ret; | |
73 } | |
74 else | |
75 { | |
76 socklen_t len; | |
77 len = sizeof(*error); | |
78 | |
79 return getsockopt(fd, SOL_SOCKET, SO_ERROR, error, &len); | |
80 } | |
81 } | |
82 | |
61 void | 83 void |
62 gaim_eventloop_set_ui_ops(GaimEventLoopUiOps *ops) | 84 gaim_eventloop_set_ui_ops(GaimEventLoopUiOps *ops) |
63 { | 85 { |
64 eventloop_ui_ops = ops; | 86 eventloop_ui_ops = ops; |
65 } | 87 } |