static gint fd_check_io(gint fd, GIOCondition cond) { struct timeval timeout; fd_set fds; if (is_nonblocking_mode(fd)) return 0; timeout.tv_sec = io_timeout; timeout.tv_usec = 0; FD_ZERO(&fds); FD_SET(fd, &fds); if (cond == G_IO_IN) { select(fd + 1, &fds, NULL, NULL, io_timeout > 0 ? &timeout : NULL); } else { select(fd + 1, NULL, &fds, NULL, io_timeout > 0 ? &timeout : NULL); } if (FD_ISSET(fd, &fds)) { return 0; } else { g_warning("Socket IO timeout\n"); log_error(LOG_PROTOCOL, _("Socket IO timeout.\n")); return -1; } }
gboolean sock_is_nonblocking_mode(SockInfo *sock) { g_return_val_if_fail(sock != NULL, FALSE); #ifdef G_OS_WIN32 return SOCK_IS_NONBLOCK(sock->flags); #else return is_nonblocking_mode(sock->sock); #endif }
gboolean sock_is_nonblocking_mode(SockInfo *sock) { cm_return_val_if_fail(sock != NULL, FALSE); return is_nonblocking_mode(sock->sock); }