On 2017-05-22 15:50, Lars Schneider wrote: > + > +int async_query_available_blobs(const char *cmd, struct string_list *delayed_paths) > +{ > + int err; > + char *line; > + struct cmd2process *entry; > + struct child_process *process; > + struct strbuf filter_status = STRBUF_INIT; > + > + entry = find_multi_file_filter_entry(&cmd_process_map, cmd); > + if (!entry) { > + error("external filter '%s' is not available anymore although " > + "not all paths have been filtered", cmd); > + return 0; > + } > + process = &entry->process; > + sigchain_push(SIGPIPE, SIG_IGN); > + > + err = packet_write_fmt_gently( > + process->in, "command=list_available_blobs\n"); > + if (err) > + goto done; > + > + err = packet_flush_gently(process->in); > + if (err) > + goto done; > + > + for (;;) { > + const char* pre = "pathname="; > + const int pre_len = strlen(pre); > + line = packet_read_line(process->out, NULL); > + if (!line) > + break; > + err = strlen(line) <= pre_len || strncmp(line, pre, pre_len); > + if (err) > + goto done; > + string_list_insert(delayed_paths, xstrdup(line+pre_len)); > + } > + > + read_multi_file_filter_status(process->out, &filter_status); > + err = strcmp(filter_status.buf, "success"); > + > +done: > + sigchain_pop(SIGPIPE); > + > + if (err || errno == EPIPE) { This looks strange, at first glance. Do we set errno to 0 before ? Or is there a trick that EPIPE can only be reached, if it is "our" error ? > + if (!strcmp(filter_status.buf, "error")) { > + /* The filter signaled a problem with the file. */ > + } else { > + /* > + * Something went wrong with the protocol filter. > + * Force shutdown and restart if another blob requires > + * filtering. > + */ > + error("external filter '%s' failed", cmd); > + kill_multi_file_filter(&cmd_process_map, entry); > + } > + } > + return !err; > +} > +