diff options
-rw-r--r-- | convert.c | 41 |
1 files changed, 23 insertions, 18 deletions
@@ -556,7 +556,6 @@ static void kill_multi_file_filter(struct hashmap *hashmap, struct subprocess_en finish_command(&entry->process); hashmap_remove(hashmap, entry, NULL); - free(entry); } static void stop_multi_file_filter(struct child_process *process) @@ -570,14 +569,15 @@ static void stop_multi_file_filter(struct child_process *process) finish_command(process); } -static int start_multi_file_filter_fn(struct cmd2process *entry) +static int start_multi_file_filter_fn(struct subprocess_entry *subprocess) { int err; + struct cmd2process *entry = (struct cmd2process *)subprocess; struct string_list cap_list = STRING_LIST_INIT_NODUP; char *cap_buf; const char *cap_name; - struct child_process *process = &entry->subprocess.process; - const char *cmd = entry->subprocess.cmd; + struct child_process *process = &subprocess->process; + const char *cmd = subprocess->cmd; sigchain_push(SIGPIPE, SIG_IGN); @@ -629,17 +629,16 @@ done: return err; } -static struct cmd2process *start_multi_file_filter(struct hashmap *hashmap, const char *cmd) +typedef int(*subprocess_start_fn)(struct subprocess_entry *entry); +int start_multi_file_filter(struct hashmap *hashmap, struct subprocess_entry *entry, const char *cmd, + subprocess_start_fn startfn) { int err; - struct cmd2process *entry; struct child_process *process; const char *argv[] = { cmd, NULL }; - entry = xmalloc(sizeof(*entry)); - entry->subprocess.cmd = cmd; - entry->supported_capabilities = 0; - process = &entry->subprocess.process; + entry->cmd = cmd; + process = &entry->process; child_process_init(process); process->argv = argv; @@ -649,22 +648,23 @@ static struct cmd2process *start_multi_file_filter(struct hashmap *hashmap, cons process->clean_on_exit = 1; process->clean_on_exit_handler = stop_multi_file_filter; - if (start_command(process)) { + err = start_command(process); + if (err) { error("cannot fork to run external filter '%s'", cmd); - return NULL; + return err; } hashmap_entry_init(entry, strhash(cmd)); - err = start_multi_file_filter_fn(entry); + err = startfn(entry); if (err) { error("initialization for external filter '%s' failed", cmd); - kill_multi_file_filter(hashmap, &entry->subprocess); - return NULL; + kill_multi_file_filter(hashmap, entry); + return err; } hashmap_add(hashmap, entry); - return entry; + return 0; } static int apply_multi_file_filter(const char *path, const char *src, size_t len, @@ -689,9 +689,13 @@ static int apply_multi_file_filter(const char *path, const char *src, size_t len fflush(NULL); if (!entry) { - entry = start_multi_file_filter(&cmd_process_map, cmd); - if (!entry) + entry = xmalloc(sizeof(*entry)); + entry->supported_capabilities = 0; + + if (start_multi_file_filter(&cmd_process_map, &entry->subprocess, cmd, start_multi_file_filter_fn)) { + free(entry); return 0; + } } process = &entry->subprocess.process; @@ -765,6 +769,7 @@ done: */ error("external filter '%s' failed", cmd); kill_multi_file_filter(&cmd_process_map, &entry->subprocess); + free(entry); } } else { strbuf_swap(dst, &nbuf); |