Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  pager.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
#include <sys/select.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <sys/ioctl.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;
static int pager_columns;

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

static const char *forced_pager;

void force_pager(const char *pager)
{
 forced_pager = pager;
}

static void pager_preexec(void)
{
 /*
 * Work around bug in "less" by not starting it until we
 * have real input
 */

 fd_set in;
 fd_set exception;

 FD_ZERO(&in);
 FD_ZERO(&exception);
 FD_SET(0, &in);
 FD_SET(0, &exception);
 select(1, &in, NULL, &exception, NULL);

 setenv("LESS""FRSX", 0);
}

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);
}

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

void setup_pager(void)
{
 const char *pager = getenv(subcmd_config.pager_env);
 struct winsize sz;

 if (forced_pager)
  pager = forced_pager;
 if (!isatty(1) && !forced_pager)
  return;
 if (ioctl(1, TIOCGWINSZ, &sz) == 0)
  pager_columns = sz.ws_col;
 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);
}

int pager_in_use(void)
{
 return spawned_pager;
}

int pager_get_columns(void)
{
 char *s;

 s = getenv("COLUMNS");
 if (s)
  return atoi(s);

 return (pager_columns ? pager_columns : 80) - 2;
}

Messung V0.5
C=94 H=87 G=90

¤ Dauer der Verarbeitung: 0.11 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge