filesystem-change-evt: report inotify_init() error correctly

This commit is contained in:
Matthew Flatt 2014-07-24 13:58:04 +01:00
parent c570a86201
commit f0e710179c
2 changed files with 27 additions and 13 deletions

View File

@ -23,7 +23,7 @@ typedef struct mz_wd_t {
} mz_wd_t;
typedef struct mz_inotify_state_t {
int ready, fd;
int ready, errid, fd;
mz_wd_t *wds;
int size, count;
int got;
@ -114,18 +114,24 @@ static void mz_inotify_start(mz_inotify_state_t *s)
int fd;
fd = inotify_init();
s->ready = 1;
s->fd = fd;
if (fd == -1) {
s->errid = errno;
} else {
s->errid = 0;
s->ready = 1;
s->fd = fd;
}
}
static void mz_inotify_end(mz_inotify_state_t *s)
{
int rc;
do {
rc = close(s->fd);
} while (rc == -1 && errno == EINTR);
if (s->ready) {
do {
rc = close(s->fd);
} while (rc == -1 && errno == EINTR);
}
if (s->wds) free(s->wds);
@ -134,16 +140,17 @@ static void mz_inotify_end(mz_inotify_state_t *s)
static void mz_inotify_init()
{
if (!scheme_inotify_server) {
mz_inotify_state_t *s;
mz_inotify_state_t *s = scheme_inotify_server;
if (!s) {
s = (mz_inotify_state_t *)malloc(sizeof(mz_inotify_state_t));
memset(s, 0, sizeof(mz_inotify_state_t));
mz_inotify_start(s);
scheme_inotify_server = s;
}
if (!s->ready)
mz_inotify_start(s);
}
static int mz_inotify_ready()
@ -153,6 +160,13 @@ static int mz_inotify_ready()
return s->ready;
}
static int mz_inotify_errid()
{
mz_inotify_state_t *s = (mz_inotify_state_t *)scheme_inotify_server;
return s->errid;
}
/* Other functions are called only if mz_inotify_ready() returns 1. */
static int mz_inotify_add(char *filename)
@ -166,7 +180,7 @@ static int mz_inotify_add(char *filename)
int i;
new_wds = (mz_wd_t *)malloc(sizeof(mz_wd_t) * new_size);
memcpy(new_wds, s->wds, s->size * sizeof(mz_wd_t));
free(s->wds);
if (s->wds) free(s->wds);
s->wds = new_wds;
s->size = new_size;
for (i = s->count; i < s->size; i++)

View File

@ -6060,7 +6060,7 @@ Scheme_Object *scheme_filesystem_change_evt(Scheme_Object *path, int flags, int
/* see "inotify.inc" */
mz_inotify_init();
if (!mz_inotify_ready())
errid = EAGAIN;
errid = mz_inotify_errid();
else {
fd = mz_inotify_add(filename);
if (fd == -1)