Ben Peart <peartben@xxxxxxxxx> writes: > Subject: [PATCH v6 3/8] convert: Split start_multi_file_filter into two separate functions Two minor nits, because the capital after "<area>:" looks ugly in shortlog output, and having () there makes it easier to notice that a function name is being discussed. I.e. convert: split start_multi_file_filter() into two separate functions > To enable future reuse of the filter.<driver>.process infrastructure, > split start_multi_file_filter into two separate parts. > > start_multi_file_filter will now only contain the generic logic to > manage the creation and tracking of the child process in a hashmap. > > start_multi_file_filter_fn is a protocol specific initialization > function that will negotiate the multi-file-filter interface version > and capabilities. The above fails to describe a lot more important/significant change this patch makes. Two mistaken check "errno == EPIPE" have been removed as a preliminary bugfix. I think the bugfix deserves to be split into a separate patch by itself and hoisted much earlier in the series. It alone is a very good change, with or without the remainder of the changes in this patch. Thanks. > Signed-off-by: Ben Peart <benpeart@xxxxxxxxxxxxx> > --- > convert.c | 62 ++++++++++++++++++++++++++++++++++++-------------------------- > 1 file changed, 36 insertions(+), 26 deletions(-) > > diff --git a/convert.c b/convert.c > index 793c29ebfd..36401fe087 100644 > --- a/convert.c > +++ b/convert.c > @@ -565,35 +565,14 @@ static void stop_multi_file_filter(struct child_process *process) > finish_command(process); > } > > -static struct cmd2process *start_multi_file_filter(struct hashmap *hashmap, const char *cmd) > +static int start_multi_file_filter_fn(struct cmd2process *entry) > { > int err; > - struct cmd2process *entry; > - struct child_process *process; > - const char *argv[] = { cmd, NULL }; > struct string_list cap_list = STRING_LIST_INIT_NODUP; > char *cap_buf; > const char *cap_name; > - > - entry = xmalloc(sizeof(*entry)); > - entry->cmd = cmd; > - entry->supported_capabilities = 0; > - process = &entry->process; > - > - child_process_init(process); > - process->argv = argv; > - process->use_shell = 1; > - process->in = -1; > - process->out = -1; > - process->clean_on_exit = 1; > - process->clean_on_exit_handler = stop_multi_file_filter; > - > - if (start_command(process)) { > - error("cannot fork to run external filter '%s'", cmd); > - return NULL; > - } > - > - hashmap_entry_init(entry, strhash(cmd)); > + struct child_process *process = &entry->process; > + const char *cmd = entry->cmd; > > sigchain_push(SIGPIPE, SIG_IGN); > > @@ -642,7 +621,38 @@ static struct cmd2process *start_multi_file_filter(struct hashmap *hashmap, cons > done: > sigchain_pop(SIGPIPE); > > - if (err || errno == EPIPE) { > + return err; > +} > + > +static struct cmd2process *start_multi_file_filter(struct hashmap *hashmap, const char *cmd) > +{ > + int err; > + struct cmd2process *entry; > + struct child_process *process; > + const char *argv[] = { cmd, NULL }; > + > + entry = xmalloc(sizeof(*entry)); > + entry->cmd = cmd; > + entry->supported_capabilities = 0; > + process = &entry->process; > + > + child_process_init(process); > + process->argv = argv; > + process->use_shell = 1; > + process->in = -1; > + process->out = -1; > + process->clean_on_exit = 1; > + process->clean_on_exit_handler = stop_multi_file_filter; > + > + if (start_command(process)) { > + error("cannot fork to run external filter '%s'", cmd); > + return NULL; > + } > + > + hashmap_entry_init(entry, strhash(cmd)); > + > + err = start_multi_file_filter_fn(entry); > + if (err) { > error("initialization for external filter '%s' failed", cmd); > kill_multi_file_filter(hashmap, entry); > return NULL; > @@ -733,7 +743,7 @@ static int apply_multi_file_filter(const char *path, const char *src, size_t len > done: > sigchain_pop(SIGPIPE); > > - if (err || errno == EPIPE) { > + if (err) { > if (!strcmp(filter_status.buf, "error")) { > /* The filter signaled a problem with the file. */ > } else if (!strcmp(filter_status.buf, "abort")) {