X-Git-Url: https://git.cameronkatri.com/bsdgames-darwin.git/blobdiff_plain/46b902da5252697ebfccc29f3d5525122fbf1033..b0651eac5bc91d18148a15be3afbce73d4dabb23:/cribbage/instr.c diff --git a/cribbage/instr.c b/cribbage/instr.c index c2ab997a..5c7738c0 100644 --- a/cribbage/instr.c +++ b/cribbage/instr.c @@ -1,4 +1,4 @@ -/* $NetBSD: instr.c,v 1.4 1996/02/06 22:47:18 jtc Exp $ */ +/* $NetBSD: instr.c,v 1.9 1999/11/09 15:06:32 drochner Exp $ */ /*- * Copyright (c) 1990, 1993 @@ -33,11 +33,12 @@ * SUCH DAMAGE. */ +#include #ifndef lint #if 0 static char sccsid[] = "@(#)instr.c 8.1 (Berkeley) 5/31/93"; #else -static char rcsid[] = "$NetBSD: instr.c,v 1.4 1996/02/06 22:47:18 jtc Exp $"; +__RCSID("$NetBSD: instr.c,v 1.9 1999/11/09 15:06:32 drochner Exp $"); #endif #endif /* not lint */ @@ -46,6 +47,8 @@ static char rcsid[] = "$NetBSD: instr.c,v 1.4 1996/02/06 22:47:18 jtc Exp $"; #include #include +#include +#include #include #include #include @@ -59,34 +62,41 @@ static char rcsid[] = "$NetBSD: instr.c,v 1.4 1996/02/06 22:47:18 jtc Exp $"; void instructions() { - struct stat sb; - union wait pstat; + int pstat; + int fd; pid_t pid; - char *pager, *path; + const char *path; - if (stat(_PATH_INSTR, &sb)) { - (void)fprintf(stderr, "cribbage: %s: %s.\n", _PATH_INSTR, - strerror(errno)); - exit(1); - } switch (pid = vfork()) { case -1: - (void)fprintf(stderr, "cribbage: %s.\n", strerror(errno)); - exit(1); + err(1, "vfork"); case 0: - if (!(path = getenv("PAGER"))) - path = _PATH_MORE; - if (pager = rindex(path, '/')) - ++pager; - pager = path; - execlp(path, pager, _PATH_INSTR, (char *)NULL); - (void)fprintf(stderr, "cribbage: %s.\n", strerror(errno)); + /* Follow the same behaviour for pagers as defined in POSIX.2 + * for mailx and man. We only use a pager if stdout is + * a terminal, and we pass the file on stdin to sh -c pager. + */ + if (!isatty(1)) + path = "cat"; + else { + if (!(path = getenv("PAGER")) || (*path == 0)) + path = _PATH_MORE; + } + if ((fd = open(_PATH_INSTR, O_RDONLY)) == -1) { + warn("open %s", _PATH_INSTR); + _exit(1); + } + if (dup2(fd, 0) == -1) { + warn("dup2"); + _exit(1); + } + execl("/bin/sh", "sh", "-c", path, NULL); + warn(NULL); _exit(1); default: do { - pid = waitpid(pid, (int *)&pstat, 0); + pid = waitpid(pid, &pstat, 0); } while (pid == -1 && errno == EINTR); - if (pid == -1 || pstat.w_status) + if (pid == -1 || WEXITSTATUS(pstat)) exit(1); } }