+static XCBGenericEvent *get_event(XCBConnection *c)
+{
+ struct event_list *cur = c->in.events;
+ XCBGenericEvent *ret;
+ if(!c->in.events)
+ return 0;
+ ret = cur->event;
+ c->in.events = cur->next;
+ if(!cur->next)
+ c->in.events_tail = &c->in.events;
+ free(cur);
+ return ret;
+}
+
+static int read_block(const int fd, void *buf, const size_t len)
+{
+ int done = 0;
+ while(done < len)
+ {
+ int ret = read(fd, ((char *) buf) + done, len - done);
+ if(ret > 0)
+ done += ret;
+ if(ret < 0 && errno == EAGAIN)
+ {
+ fd_set fds;
+ FD_ZERO(&fds);
+ FD_SET(fd, &fds);
+ ret = select(fd + 1, &fds, 0, 0, 0);
+ }
+ if(ret <= 0)
+ return ret;
+ }
+ return len;
+}
+