From: Martin Willi Date: Thu, 24 Oct 2013 13:07:43 +0000 (+0200) Subject: watcher: Rebuild fdset when select() fails X-Git-Tag: 5.1.1~32 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5ce3c9b15a5754498340abc6589f98629a995776;p=thirdparty%2Fstrongswan.git watcher: Rebuild fdset when select() fails This should make sure we refresh the fdset if a user closes an FD it just removed. Some selects() seem to complain about the bad FD before signaling the notification pipe. --- diff --git a/src/libstrongswan/processing/watcher.c b/src/libstrongswan/processing/watcher.c index 3009be608b..9773e7601a 100644 --- a/src/libstrongswan/processing/watcher.c +++ b/src/libstrongswan/processing/watcher.c @@ -44,6 +44,11 @@ struct private_watcher_t { */ linked_list_t *fds; + /** + * Pending update of FD list? + */ + bool pending; + /** * Lock to access FD list */ @@ -106,6 +111,7 @@ static void update(private_watcher_t *this) { char buf[1] = { 'u' }; + this->pending = TRUE; if (this->notify[1] != -1) { ignore_result(write(this->notify[1], buf, sizeof(buf))); @@ -294,6 +300,7 @@ static job_requeue_t watch(private_watcher_t *this) { DBG2(DBG_JOB, "watcher got notification, rebuilding"); while (read(this->notify[0], buf, sizeof(buf)) > 0); + this->pending = FALSE; return JOB_REQUEUE_DIRECT; } @@ -333,7 +340,11 @@ static job_requeue_t watch(private_watcher_t *this) } else { - DBG1(DBG_JOB, "watcher select() error: %s", strerror(errno)); + if (!this->pending) + { /* complain only if no pending updates */ + DBG1(DBG_JOB, "watcher select() error: %s", strerror(errno)); + } + return JOB_REQUEUE_DIRECT; } } }