static int vlc_rpc_mainloop(access_t *p_access, struct rpc_context *p_rpc_ctx, bool (*pf_until_cb)(access_t *)) { access_sys_t *p_sys = p_access->p_sys; while (!p_sys->b_error && !pf_until_cb(p_access)) { struct pollfd p_fds[1]; int i_ret; p_fds[0].fd = rpc_get_fd(p_rpc_ctx); p_fds[0].events = rpc_which_events(p_rpc_ctx); if ((i_ret = vlc_poll_i11e(p_fds, 1, -1)) < 0) { if (errno == EINTR) msg_Warn(p_access, "vlc_poll_i11e interrupted"); else msg_Err(p_access, "vlc_poll_i11e failed"); p_sys->b_error = true; } else if (i_ret > 0 && p_fds[0].revents && rpc_service(p_rpc_ctx, p_fds[0].revents) < 0) { msg_Err(p_access, "nfs_service failed"); p_sys->b_error = true; } } return p_sys->b_error ? -1 : 0; }
static void wait_for_reply(struct rpc_context *rpc, struct sync_cb_data *cb_data) { struct pollfd pfd; assert(rpc->magic == RPC_CONTEXT_MAGIC); while (!cb_data->is_finished) { pfd.fd = rpc_get_fd(rpc); pfd.events = rpc_which_events(rpc); if (poll(&pfd, 1, -1) < 0) { rpc_set_error(rpc, "Poll failed"); cb_data->status = -EIO; break; } if (rpc_service(rpc, pfd.revents) < 0) { rpc_set_error(rpc, "rpc_service failed"); cb_data->status = -EIO; break; } if (rpc_get_fd(rpc) == -1) { rpc_set_error(rpc, "Socket closed\n"); break; } } }
static void update_events(struct rpc_context *rpc, struct tevent_fd *fde) { int events = rpc_which_events(rpc); int flags = 0; if (events & POLLIN) { flags |= TEVENT_FD_READ; } if (events & POLLOUT) { flags |= TEVENT_FD_WRITE; } tevent_fd_set_flags(fde, flags); }
static void update_events(struct rpc_context *rpc, struct event *read_event, struct event *write_event) { int events = rpc_which_events(rpc); if (read_event) { if (events & POLLIN) { event_add(read_event, NULL); } else { event_del(read_event); } } if (write_event) { if (events & POLLOUT) { event_add(write_event, NULL); } else { event_del(write_event); } } }
static void wait_for_reply(struct rpc_context *rpc, struct sync_cb_data *cb_data) { struct pollfd pfd; for (;;) { if (cb_data->is_finished) { break; } pfd.fd = rpc_get_fd(rpc); pfd.events = rpc_which_events(rpc); if (poll(&pfd, 1, -1) < 0) { rpc_set_error(rpc, "Poll failed"); cb_data->status = -EIO; break; } if (rpc_service(rpc, pfd.revents) < 0) { rpc_set_error(rpc, "rpc_service failed"); cb_data->status = -EIO; break; } } }