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 }