]> git.cameronkatri.com Git - bsdgames-darwin.git/blobdiff - cribbage/instr.c
set the cursor to invisible
[bsdgames-darwin.git] / cribbage / instr.c
index d5ffdc0ed87f3c61368296026722b8ece645510b..5cd8f71f30193abec856beae4ee084b83bfd252f 100644 (file)
@@ -1,6 +1,8 @@
+/*     $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);
        }
 }