+/* $NetBSD: instr.c,v 1.14 2011/09/01 07:18:50 plunky Exp $ */
+
/*-
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
+ * Copyright (c) 1990, 1993
+ * The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
+ * 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* SUCH DAMAGE.
*/
+#include <sys/cdefs.h>
#ifndef lint
-static char sccsid[] = "@(#)instr.c 5.2 (Berkeley) 2/28/91";
+#if 0
+static char sccsid[] = "@(#)instr.c 8.1 (Berkeley) 5/31/93";
+#else
+__RCSID("$NetBSD: instr.c,v 1.14 2011/09/01 07:18:50 plunky Exp $");
+#endif
#endif /* not lint */
#include <sys/types.h>
#include <sys/wait.h>
-#include <sys/errno.h>
#include <sys/stat.h>
-#include <unistd.h>
+
+#include <curses.h>
+#include <err.h>
+#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "deck.h"
+#include "cribbage.h"
#include "pathnames.h"
-instructions()
+void
+instructions(void)
{
- extern int errno;
- 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()) {
+ 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, (char *) 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);
}
}