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;
> +}
> +

Reply via email to