From 547ccfb9f53485f8b56473f14cbde10cfcbeed07 Mon Sep 17 00:00:00 2001 From: Laurent Ghigonis Date: Sun, 22 Jul 2012 01:07:01 +0200 Subject: fix imcompatibility between imsg and imsgev ! during last commit, imsg was involontarily updated, and imsgev became incompatible with it. so update imsgev to lastest version. --- glougloud/external/imsgev.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'glougloud/external/imsgev.c') diff --git a/glougloud/external/imsgev.c b/glougloud/external/imsgev.c index 6a5052d..6b92d79 100644 --- a/glougloud/external/imsgev.c +++ b/glougloud/external/imsgev.c @@ -15,6 +15,7 @@ */ #include +#include #include #include @@ -24,7 +25,6 @@ #include #include -#include "queue.h" #include "imsgev.h" void imsgev_add(struct imsgev *); @@ -33,7 +33,8 @@ void imsgev_disconnect(struct imsgev *, int); void imsgev_init(struct imsgev *iev, int fd, void *data, - void (*callback)(struct imsgev *, int, struct imsg *)) + void (*callback)(struct imsgev *, int, struct imsg *), + void (*needfd)(struct imsgev *)) { imsg_init(&iev->ibuf, fd); iev->terminate = 0; @@ -41,6 +42,7 @@ imsgev_init(struct imsgev *iev, int fd, void *data, iev->data = data; iev->handler = imsgev_dispatch; iev->callback = callback; + iev->needfd = needfd; iev->events = EV_READ; event_set(&iev->ev, iev->ibuf.fd, iev->events, iev->handler, iev); @@ -107,8 +109,16 @@ imsgev_dispatch(int fd, short ev, void *humppa) if (ev & EV_READ) { if ((n = imsg_read(ibuf)) == -1) { - imsgev_disconnect(iev, IMSGEV_EREAD); - return; + /* if we don't have enough fds, free one up and retry */ + if (errno == EAGAIN) { + iev->needfd(iev); + n = imsg_read(ibuf); + } + + if (n == -1) { + imsgev_disconnect(iev, IMSGEV_EREAD); + return; + } } if (n == 0) { /* @@ -128,7 +138,7 @@ imsgev_dispatch(int fd, short ev, void *humppa) * closed, or some error occured. Both case are not recoverable * from the imsg perspective, so we treat it as a WRITE error. */ - if ((n = msgbuf_write(&ibuf->w)) != 0) { + if ((n = msgbuf_write(&ibuf->w)) != 1) { imsgev_disconnect(iev, IMSGEV_EWRITE); return; } -- cgit v1.2.3-59-g8ed1b