diff options
author | June McEnroe <june@causal.agency> | 2019-12-31 15:24:03 -0500 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2019-12-31 15:29:22 -0500 |
commit | 7f0bb75b29ad9e00cbe8a44398686bbb7e6695f8 (patch) | |
tree | d00f205be5e4c17aa60d5b7ec5469d4213957906 | |
parent | Normalize date input (diff) | |
download | litterbox-7f0bb75b29ad9e00cbe8a44398686bbb7e6695f8.tar.gz litterbox-7f0bb75b29ad9e00cbe8a44398686bbb7e6695f8.zip |
Set up pager pipe
-rw-r--r-- | scoop.c | 43 |
1 files changed, 37 insertions, 6 deletions
diff --git a/scoop.c b/scoop.c index f735fe2..0b652d9 100644 --- a/scoop.c +++ b/scoop.c @@ -118,12 +118,8 @@ int main(int argc, char *argv[]) { } if (optind < argc) search = argv[optind]; - dbFind(path, SQLITE_OPEN_READONLY); - if (dbVersion() != DatabaseVersion) { - errx(EX_CONFIG, "database out of date; migrate with litterbox -m"); - } - if (shell) { + dbFind(path, SQLITE_OPEN_READONLY); path = strdup(sqlite3_db_filename(db, "main")); if (!path) err(EX_OSERR, "strdup"); dbClose(); @@ -131,7 +127,36 @@ int main(int argc, char *argv[]) { err(EX_UNAVAILABLE, "sqlite3"); } - // TODO: Set up pipe to $PAGER. + bool tty = isatty(STDOUT_FILENO); + if (tty) { + const char *pager = getenv("PAGER"); + if (!pager) pager = "less"; + setenv("LESS", "FRX", 0); + + int rw[2]; + int error = pipe(rw); + if (error) err(EX_OSERR, "pipe"); + + pid_t pid = fork(); + if (pid < 0) err(EX_OSERR, "fork"); + + if (!pid) { + dup2(rw[0], STDIN_FILENO); + close(rw[0]); + close(rw[1]); + execlp(pager, pager, NULL); + err(EX_CONFIG, "%s", pager); + } + + dup2(rw[1], STDOUT_FILENO); + close(rw[0]); + close(rw[1]); + } + + dbFind(path, SQLITE_OPEN_READONLY); + if (dbVersion() != DatabaseVersion) { + errx(EX_CONFIG, "database out of date; migrate with litterbox -m"); + } char sql[4096]; if (search) { @@ -205,4 +230,10 @@ int main(int argc, char *argv[]) { sqlite3_finalize(stmt); dbClose(); + + if (tty) { + fclose(stdout); + int status; + wait(&status); + } } |