#include "c.h"
#include "xalloc.h"
#include "nls.h"
+#include "ttyutils.h"
+#include "pager.h"
#define NULL_DEVICE "/dev/null"
-void setup_pager(void);
-
static const char *pager_argv[] = { "sh", "-c", NULL, NULL };
struct child_process {
int in;
int out;
int err;
+
+ int org_err;
+ int org_out;
+
unsigned no_stdin:1;
void (*preexec_cb)(void);
};
static void wait_for_pager(void)
{
+ if (pager_process.pid == 0)
+ return;
+
fflush(stdout);
fflush(stderr);
/* signal EOF to pager */
raise(signo);
}
-void setup_pager(void)
+static void __setup_pager(void)
{
const char *pager = getenv("PAGER");
signal(SIGTERM, wait_for_pager_signal);
signal(SIGQUIT, wait_for_pager_signal);
signal(SIGPIPE, wait_for_pager_signal);
+}
+
+/* Setup pager and redirects output to the $PAGER. The pager is closed at exit.
+ */
+void pager_redirect(void)
+{
+ if (pager_process.pid)
+ return; /* already running */
+
+ __setup_pager();
atexit(wait_for_pager);
}
+/* Setup pager and redirect output, the pager may be closed by pager_close().
+ */
+void pager_open(void)
+{
+ if (pager_process.pid)
+ return; /* already running */
+
+ pager_process.org_out = dup(STDOUT_FILENO);
+ pager_process.org_err = dup(STDERR_FILENO);
+
+ __setup_pager();
+}
+
+/* Close pager and restore original std{out,err}.
+ */
+void pager_close(void)
+{
+ if (pager_process.pid == 0)
+ return;
+
+ wait_for_pager();
+ dup2(pager_process.org_out, STDOUT_FILENO);
+ dup2(pager_process.org_err, STDERR_FILENO);
+
+ close(pager_process.org_out);
+ close(pager_process.org_err);
+
+ memset(&pager_process, 0, sizeof(pager_process));
+}
+
#ifdef TEST_PROGRAM
#define MAX 255
{
int i;
- setup_pager();
+ pager_setup();
for (i = 0; i < MAX; i++)
printf("%d\n", i);
return EXIT_SUCCESS;
nopager = 1;
ctl.pager = nopager ? 0 : ctl.pager;
if (ctl.pager)
- setup_pager();
+ pager_redirect();
switch (ctl.action) {
case SYSLOG_ACTION_READ_ALL:
errx(EXIT_FAILURE, _("--raw can be used together with --level or "
"--facility only when reading messages from /dev/kmsg"));
if (ctl.pager)
- setup_pager();
+ pager_redirect();
n = read_buffer(&ctl, &buf);
if (n > 0)
print_buffer(&ctl, buf, n);