static int proc_cleanup_exit(ProcessData *proc_data, uv_process_options_t *proc_opts, int shellopts) { if (proc_data->exited) { if (!emsg_silent && proc_data->exit_status != 0 && !(shellopts & kShellOptSilent)) { MSG_PUTS(_("\nshell returned ")); msg_outnum((int64_t)proc_data->exit_status); msg_putchar('\n'); } } State = proc_data->old_state; if (proc_data->old_mode == TMODE_RAW) { // restore mode settmode(TMODE_RAW); } signal_accept_deadly(); // Release argv memory shell_free_argv(proc_opts->args); return proc_data->exit_status; }
/// Calls the user-configured 'shell' (p_sh) for running a command or wildcard /// expansion. /// /// @param cmd The command to execute, or NULL to run an interactive shell. /// @param opts Options that control how the shell will work. /// @param extra_args Extra arguments to the shell, or NULL. int os_call_shell(char_u *cmd, ShellOpts opts, char_u *extra_args) { DynamicBuffer input = DYNAMIC_BUFFER_INIT; char *output = NULL, **output_ptr = NULL; int current_state = State; bool forward_output = true; // While the child is running, ignore terminating signals signal_reject_deadly(); if (opts & (kShellOptHideMess | kShellOptExpand)) { forward_output = false; } else { State = EXTERNCMD; if (opts & kShellOptWrite) { read_input(&input); } if (opts & kShellOptRead) { output_ptr = &output; forward_output = false; } } size_t nread; int status = do_os_system(shell_build_argv((char *)cmd, (char *)extra_args), input.data, input.len, output_ptr, &nread, emsg_silent, forward_output); xfree(input.data); if (output) { (void)write_output(output, nread, true, true); xfree(output); } if (!emsg_silent && status != 0 && !(opts & kShellOptSilent)) { MSG_PUTS(_("\nshell returned ")); msg_outnum(status); msg_putchar('\n'); } State = current_state; signal_accept_deadly(); return status; }
/// Calls the user shell for running a command, interactive session or /// wildcard expansion. It uses the shell set in the `sh` option. /// /// @param cmd The command to be executed. If NULL it will run an interactive /// shell /// @param opts Various options that control how the shell will work /// @param extra_arg Extra argument to be passed to the shell int os_call_shell(char_u *cmd, ShellOpts opts, char_u *extra_arg) { DynamicBuffer input = DYNAMIC_BUFFER_INIT; char *output = NULL, **output_ptr = NULL; int current_state = State, old_mode = cur_tmode; bool forward_output = true; out_flush(); if (opts & kShellOptCooked) { settmode(TMODE_COOK); } // While the child is running, ignore terminating signals signal_reject_deadly(); if (opts & (kShellOptHideMess | kShellOptExpand)) { forward_output = false; } else { State = EXTERNCMD; if (opts & kShellOptWrite) { read_input(&input); } if (opts & kShellOptRead) { output_ptr = &output; forward_output = false; } } size_t nread; int status = shell((const char *)cmd, (const char *)extra_arg, input.data, input.len, output_ptr, &nread, emsg_silent, forward_output); if (input.data) { free(input.data); } if (output) { write_output(output, nread); free(output); } if (!emsg_silent && status != 0 && !(opts & kShellOptSilent)) { MSG_PUTS(_("\nshell returned ")); msg_outnum(status); msg_putchar('\n'); } if (old_mode == TMODE_RAW) { // restore mode settmode(TMODE_RAW); } State = current_state; signal_accept_deadly(); return status; }