diff --git a/include/natalie.hpp b/include/natalie.hpp index 2626f01fc..a36aedafe 100644 --- a/include/natalie.hpp +++ b/include/natalie.hpp @@ -171,8 +171,6 @@ std::pair coerce(Env *, Value, Value, CoerceInvalidReturnValueMode Block *to_block(Env *, Value); inline Block *to_block(Env *, Block *block) { return block; } -Value shell_backticks(Env *, Value); - FILE *popen2(const char *, const char *, pid_t &); int pclose2(FILE *, pid_t); diff --git a/src/kernel_module.cpp b/src/kernel_module.cpp index 720205f43..29539120d 100644 --- a/src/kernel_module.cpp +++ b/src/kernel_module.cpp @@ -52,7 +52,27 @@ Value KernelModule::at_exit(Env *env, Block *block) { } Value KernelModule::backtick(Env *env, Value command) { - return shell_backticks(env, command->to_str(env)); + constexpr size_t NAT_SHELL_READ_BYTES = 1024; + pid_t pid; + auto process = popen2(command->to_str(env)->c_str(), "r", pid); + if (!process) + env->raise_errno(); + char buf[NAT_SHELL_READ_BYTES]; + auto result = fgets(buf, NAT_SHELL_READ_BYTES, process); + StringObject *out; + if (result) { + out = new StringObject { buf }; + while (1) { + result = fgets(buf, NAT_SHELL_READ_BYTES, process); + if (!result) break; + out->append(buf); + } + } else { + out = new StringObject {}; + } + int status = pclose2(process, pid); + set_status_object(env, pid, status); + return out; } Value KernelModule::binding(Env *env) { diff --git a/src/natalie.cpp b/src/natalie.cpp index a3393149d..5fff8c48a 100644 --- a/src/natalie.cpp +++ b/src/natalie.cpp @@ -740,32 +740,6 @@ Block *to_block(Env *env, Value proc_or_nil) { return proc_or_nil->to_proc(env)->block(); } -#define NAT_SHELL_READ_BYTES 1024 - -Value shell_backticks(Env *env, Value command) { - command->assert_type(env, Object::Type::String, "String"); - pid_t pid; - auto process = popen2(command->as_string()->c_str(), "r", pid); - if (!process) - env->raise_errno(); - char buf[NAT_SHELL_READ_BYTES]; - auto result = fgets(buf, NAT_SHELL_READ_BYTES, process); - StringObject *out; - if (result) { - out = new StringObject { buf }; - while (1) { - result = fgets(buf, NAT_SHELL_READ_BYTES, process); - if (!result) break; - out->append(buf); - } - } else { - out = new StringObject {}; - } - int status = pclose2(process, pid); - set_status_object(env, pid, status); - return out; -} - // https://stackoverflow.com/a/26852210/197498 FILE *popen2(const char *command, const char *type, pid_t &pid) { pid_t child_pid;