[:pipe-line-to] try to fix mysterious crash in child

master
Tim Stack 4 weeks ago
parent 5b88dbd162
commit 545a74f35b

@ -1992,6 +1992,47 @@ com_pipe_to(exec_context& ec,
auto* tc = *lnav_data.ld_view_stack.top();
auto bv = combined_user_marks(tc->get_bookmarks());
bool pipe_line_to = (args[0] == "pipe-line-to");
auto path_v = ec.ec_path_stack;
std::map<std::string, std::string> extra_env;
if (pipe_line_to && tc == &lnav_data.ld_views[LNV_LOG]) {
log_data_helper ldh(lnav_data.ld_log_source);
char tmp_str[64];
ldh.parse_line(ec.ec_top_line, true);
auto format = ldh.ldh_file->get_format();
auto source_path = format->get_source_path();
path_v.insert(path_v.end(), source_path.begin(), source_path.end());
extra_env["log_line"] = fmt::to_string((int) ec.ec_top_line);
sql_strftime(tmp_str, sizeof(tmp_str), ldh.ldh_line->get_timeval());
extra_env["log_time"] = tmp_str;
extra_env["log_path"] = ldh.ldh_file->get_filename();
extra_env["log_level"] = ldh.ldh_line->get_level_name();
if (ldh.ldh_line_values.lvv_opid_value) {
extra_env["log_opid"] = ldh.ldh_line_values.lvv_opid_value.value();
}
auto read_res = ldh.ldh_file->read_raw_message(ldh.ldh_line);
if (read_res.isOk()) {
auto raw_text = to_string(read_res.unwrap());
extra_env["log_raw_text"] = raw_text;
}
for (auto& ldh_line_value : ldh.ldh_line_values.lvv_values) {
extra_env[ldh_line_value.lv_meta.lvm_name.to_string()]
= ldh_line_value.to_string();
}
auto iter = ldh.ldh_parser->dp_pairs.begin();
for (size_t lpc = 0; lpc < ldh.ldh_parser->dp_pairs.size();
lpc++, ++iter)
{
std::string colname = ldh.ldh_parser->get_element_string(
iter->e_sub_elements->front());
colname = ldh.ldh_namer->add_column(colname).to_string();
std::string val = ldh.ldh_parser->get_element_string(
iter->e_sub_elements->back());
extra_env[colname] = val;
}
}
std::string cmd = trim(remaining_args(cmdline, args));
auto for_child_res = auto_pipe::for_child_fds(STDIN_FILENO, STDOUT_FILENO);
@ -2015,66 +2056,22 @@ com_pipe_to(exec_context& ec,
strerror(errno));
case 0: {
const char* args[] = {
const char* exec_args[] = {
"sh",
"-c",
cmd.c_str(),
nullptr,
};
auto path_v = ec.ec_path_stack;
std::string path;
dup2(STDOUT_FILENO, STDERR_FILENO);
path_v.emplace_back(lnav::paths::dotlnav() / "formats/default");
if (pipe_line_to && tc == &lnav_data.ld_views[LNV_LOG]) {
auto& lss = lnav_data.ld_log_source;
log_data_helper ldh(lss);
char tmp_str[64];
ldh.parse_line(ec.ec_top_line, true);
auto format = ldh.ldh_file->get_format();
auto source_path = format->get_source_path();
path_v.insert(
path_v.end(), source_path.begin(), source_path.end());
snprintf(tmp_str, sizeof(tmp_str), "%d", (int) ec.ec_top_line);
setenv("log_line", tmp_str, 1);
sql_strftime(
tmp_str, sizeof(tmp_str), ldh.ldh_line->get_timeval());
setenv("log_time", tmp_str, 1);
setenv("log_path", ldh.ldh_file->get_filename().c_str(), 1);
setenv("log_level", ldh.ldh_line->get_level_name(), 1);
if (ldh.ldh_line_values.lvv_opid_value) {
setenv("log_opid",
ldh.ldh_line_values.lvv_opid_value->c_str(),
1);
}
auto read_res = ldh.ldh_file->read_raw_message(ldh.ldh_line);
if (read_res.isOk()) {
auto raw_text = to_string(read_res.unwrap());
setenv("log_raw_text", raw_text.c_str(), 1);
}
for (auto& ldh_line_value : ldh.ldh_line_values.lvv_values) {
setenv(ldh_line_value.lv_meta.lvm_name.get(),
ldh_line_value.to_string().c_str(),
1);
}
auto iter = ldh.ldh_parser->dp_pairs.begin();
for (size_t lpc = 0; lpc < ldh.ldh_parser->dp_pairs.size();
lpc++, ++iter)
{
std::string colname = ldh.ldh_parser->get_element_string(
iter->e_sub_elements->front());
colname = ldh.ldh_namer->add_column(colname).to_string();
std::string val = ldh.ldh_parser->get_element_string(
iter->e_sub_elements->back());
setenv(colname.c_str(), val.c_str(), 1);
}
}
setenv("PATH", lnav::filesystem::build_path(path_v).c_str(), 1);
execvp(args[0], (char* const*) args);
for (const auto& pair : extra_env) {
setenv(pair.first.c_str(), pair.second.c_str(), 1);
}
execvp(exec_args[0], (char* const*) exec_args);
_exit(1);
break;
}

Loading…
Cancel
Save