cregit-Linux how code gets into the kernel

Release 4.7 tools/lib/subcmd/pager.c

Directory: tools/lib/subcmd
#include <sys/select.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include "pager.h"
#include "run-command.h"
#include "sigchain.h"
#include "subcmd-config.h"

/*
 * This is split up from the rest of git so that we can do
 * something different on Windows.
 */


static int spawned_pager;


void pager_init(const char *pager_env) { subcmd_config.pager_env = pager_env; }

Contributors

PersonTokensPropCommitsCommitProp
josh poimboeufjosh poimboeuf16100.00%1100.00%
Total16100.00%1100.00%


static void pager_preexec(void) { /* * Work around bug in "less" by not starting it until we * have real input */ fd_set in; FD_ZERO(&in); FD_SET(0, &in); select(1, &in, NULL, &in, NULL); setenv("LESS", "FRSX", 0); }

Contributors

PersonTokensPropCommitsCommitProp
ingo molnaringo molnar50100.00%1100.00%
Total50100.00%1100.00%

static const char *pager_argv[] = { "sh", "-c", NULL, NULL }; static struct child_process pager_process;
static void wait_for_pager(void) { fflush(stdout); fflush(stderr); /* signal EOF to pager */ close(1); close(2); finish_command(&pager_process); }

Contributors

PersonTokensPropCommitsCommitProp
ingo molnaringo molnar35100.00%1100.00%
Total35100.00%1100.00%


static void wait_for_pager_signal(int signo) { wait_for_pager(); sigchain_pop(signo); raise(signo); }

Contributors

PersonTokensPropCommitsCommitProp
ingo molnaringo molnar22100.00%1100.00%
Total22100.00%1100.00%


void setup_pager(void) { const char *pager = getenv(subcmd_config.pager_env); if (!isatty(1)) return; if (!pager) pager = getenv("PAGER"); if (!(pager || access("/usr/bin/pager", X_OK))) pager = "/usr/bin/pager"; if (!(pager || access("/usr/bin/less", X_OK))) pager = "/usr/bin/less"; if (!pager) pager = "cat"; if (!*pager || !strcmp(pager, "cat")) return; spawned_pager = 1; /* means we are emitting to terminal */ /* spawn the pager */ pager_argv[2] = pager; pager_process.argv = pager_argv; pager_process.in = -1; pager_process.preexec_cb = pager_preexec; if (start_command(&pager_process)) return; /* original process continues, but writes to the pipe */ dup2(pager_process.in, 1); if (isatty(2)) dup2(pager_process.in, 2); close(pager_process.in); /* this makes sure that the parent terminates after the pager */ sigchain_push_common(wait_for_pager_signal); atexit(wait_for_pager); }

Contributors

PersonTokensPropCommitsCommitProp
ingo molnaringo molnar14578.38%125.00%
michael lentinemichael lentine2010.81%125.00%
avik silavik sil179.19%125.00%
josh poimboeufjosh poimboeuf31.62%125.00%
Total185100.00%4100.00%


int pager_in_use(void) { return spawned_pager; }

Contributors

PersonTokensPropCommitsCommitProp
ingo molnaringo molnar990.00%150.00%
josh poimboeufjosh poimboeuf110.00%150.00%
Total10100.00%2100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
ingo molnaringo molnar29679.57%116.67%
josh poimboeufjosh poimboeuf3910.48%350.00%
michael lentinemichael lentine205.38%116.67%
avik silavik sil174.57%116.67%
Total372100.00%6100.00%
Directory: tools/lib/subcmd
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
{% endraw %}