aboutsummaryrefslogtreecommitdiff
path: root/src/im-sandbox.c
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2014-12-10 18:23:10 +0100
committerThomas White <taw@physics.org>2014-12-10 18:23:10 +0100
commit08258e0a8f2cdc1e1f005e11fa5295784cff22ec (patch)
treeb52a053a78e59b30a936aa114cfda0849607b30a /src/im-sandbox.c
parent6f28aa507cdf41715992acdef3d4854b9ab32704 (diff)
Improve detection of error conditions when reading events in worker processes
Diffstat (limited to 'src/im-sandbox.c')
-rw-r--r--src/im-sandbox.c41
1 files changed, 32 insertions, 9 deletions
diff --git a/src/im-sandbox.c b/src/im-sandbox.c
index 1e567fb6..7b810da5 100644
--- a/src/im-sandbox.c
+++ b/src/im-sandbox.c
@@ -268,6 +268,8 @@ struct buffer_data
int fd;
int rbufpos;
int rbuflen;
+ int eof;
+ int err;
};
@@ -276,8 +278,19 @@ static int read_fpe_data(struct buffer_data *bd)
int rval;
int no_line = 0;
+ bd->eof = 0;
+ bd->err = 0;
+
rval = read(bd->fd, bd->rbuffer+bd->rbufpos, bd->rbuflen-bd->rbufpos);
- if ( (rval == -1) || (rval == 0) ) return 1;
+ if ( rval == 0 ) {
+ bd->eof = 1;
+ return 1;
+ }
+ if ( rval == -1 ) {
+ bd->err = 1;
+ return 1;
+ }
+
bd->rbufpos += rval;
assert(bd->rbufpos <= bd->rbuflen);
@@ -292,7 +305,7 @@ static int read_fpe_data(struct buffer_data *bd)
/* Is there a line in the buffer? */
if ( bd->rbuffer[i] == '\n' ) {
- bd->rbuffer[i] = '\0';
+ bd->rbuffer[i] = '\n';
line_end = i;
line_ready = 1;
break;
@@ -358,6 +371,8 @@ static void run_work(const struct index_args *iargs,
bd.rbufpos = 0;
bd.line = NULL;
bd.fd = 0;
+ bd.eof = 0;
+ bd.err = 1;
fh = fdopen(filename_pipe, "r");
if ( fh == NULL ) {
@@ -380,11 +395,9 @@ static void run_work(const struct index_args *iargs,
struct pattern_args pargs;
int c;
- int error;
int rval;
char buf[1024];
- error = 0;
pargs.filename_p_e = initialize_filename_plus_event();
rval = 0;
@@ -431,17 +444,20 @@ static void run_work(const struct index_args *iargs,
} while ( !rval );
- if ( error == 1 ) {
+ if ( bd.err ) {
+ ERROR("Event pipe read error: %s\n", strerror(errno));
allDone = 1;
continue;
}
- chomp(bd.line);
-
- if ( strlen(bd.line) == 0 ) {
-
+ if ( bd.eof ) {
+ ERROR("Event pipe EOF (should not happen).\n");
allDone = 1;
+ continue;
+ }
+ if ( bd.line[0] == '\n' ) {
+ allDone = 1;
} else {
char filename[1024];
@@ -449,14 +465,21 @@ static void run_work(const struct index_args *iargs,
struct event* ev;
int ser;
+ chomp(bd.line);
+
sscanf(bd.line, "%s %s %i", filename, event_str, &ser);
pargs.filename_p_e->filename = strdup(filename);
+ /* Make absolutely sure the same event won't be
+ * processed a second time */
+ bd.line[0] = '\0';
+
if ( strcmp(event_str, "/") != 0 ) {
ev = get_event_from_event_string(event_str);
if ( ev == NULL ) {
ERROR("Error in event recovery\n");
+ continue;
}
pargs.filename_p_e->ev = ev;