aboutsummaryrefslogtreecommitdiffstats
path: root/ruby.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2020-02-04 09:47:58 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2020-04-12 14:58:13 +0900
commitf22c4ff359498ab342e4b6d6feb21af6004ee270 (patch)
treec14ed2082420113ed02a8c0108575729818d2341 /ruby.c
parent5c2768181382bf84137759efea66f3aaf212665d (diff)
downloadruby-f22c4ff359498ab342e4b6d6feb21af6004ee270.tar.gz
View the help message with PAGER [Feature #16754]
View the help message wth pager designed by RUBY_PAGER or PAGER environment variable, unless that value is empty.
Diffstat (limited to 'ruby.c')
-rw-r--r--ruby.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/ruby.c b/ruby.c
index 78127cbe4b..a3d67d3f46 100644
--- a/ruby.c
+++ b/ruby.c
@@ -1606,6 +1606,35 @@ process_options(int argc, char **argv, ruby_cmdline_options_t *opt)
(argc > 0 && argv && argv[0] ? argv[0] :
origarg.argc > 0 && origarg.argv && origarg.argv[0] ? origarg.argv[0] :
ruby_engine);
+#ifdef HAVE_WORKING_FORK
+ if (opt->dump & DUMP_BIT(help)) {
+ const char *pager_env = getenv("RUBY_PAGER");
+ if (!pager_env) pager_env = getenv("PAGER");
+ if (pager_env && *pager_env && isatty(0) && isatty(1)) {
+ VALUE pager = rb_str_new_cstr(pager_env);
+ int fds[2];
+ if (rb_pipe(fds) == 0) {
+ rb_pid_t pid = fork();
+ if (pid > 0) {
+ /* exec PAGER with reading from child */
+ dup2(fds[0], 0);
+ }
+ else if (pid == 0) {
+ /* send the help message to the parent PAGER */
+ dup2(fds[1], 1);
+ dup2(fds[1], 2);
+ }
+ close(fds[0]);
+ close(fds[1]);
+ if (pid > 0) {
+ rb_f_exec(1, &pager);
+ kill(SIGTERM, pid);
+ rb_waitpid(pid, 0, 0);
+ }
+ }
+ }
+ }
+#endif
usage(progname, (opt->dump & DUMP_BIT(help)));
return Qtrue;
}