X-Git-Url: https://git.cameronkatri.com/bsdgames-darwin.git/blobdiff_plain/a2515e35506e73e8f6422799dea7f4834cd0f558..5a1c62c6b8c4c4c2fa8649ae49a04e2ba5ef2c33:/fish/fish.c diff --git a/fish/fish.c b/fish/fish.c index c81da3ff..06e15859 100644 --- a/fish/fish.c +++ b/fish/fish.c @@ -1,4 +1,4 @@ -/* $NetBSD: fish.c,v 1.6 1998/09/13 15:27:27 hubertf Exp $ */ +/* $NetBSD: fish.c,v 1.13 2000/05/08 07:56:03 mycroft Exp $ */ /*- * Copyright (c) 1990, 1993 @@ -46,7 +46,7 @@ __COPYRIGHT("@(#) Copyright (c) 1990, 1993\n\ #if 0 static char sccsid[] = "@(#)fish.c 8.1 (Berkeley) 5/31/93"; #else -__RCSID("$NetBSD: fish.c,v 1.6 1998/09/13 15:27:27 hubertf Exp $"); +__RCSID("$NetBSD: fish.c,v 1.13 2000/05/08 07:56:03 mycroft Exp $"); #endif #endif /* not lint */ @@ -65,25 +65,27 @@ __RCSID("$NetBSD: fish.c,v 1.6 1998/09/13 15:27:27 hubertf Exp $"); #define RANKS 13 #define HANDSIZE 7 #define CARDS 4 +#define TOTCARDS RANKS * CARDS #define USER 1 #define COMPUTER 0 #define OTHER(a) (1 - (a)) -char *cards[] = { +const char *const cards[] = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", NULL, }; #define PRC(card) (void)printf(" %s", cards[card]) int promode; -int asked[RANKS], comphand[RANKS], deck[RANKS]; +int asked[RANKS], comphand[RANKS], deck[TOTCARDS]; int userasked[RANKS], userhand[RANKS]; +int curcard = TOTCARDS; -void chkwinner __P((int, int *)); +void chkwinner __P((int, const int *)); int compmove __P((void)); -int countbooks __P((int *)); -int countcards __P((int *)); +int countbooks __P((const int *)); +int countcards __P((const int *)); int drawcard __P((int, int *)); int gofish __P((int, int, int *)); void goodmove __P((int, int, int *, int *)); @@ -91,7 +93,7 @@ void init __P((void)); void instructions __P((void)); int main __P((int, char *[])); int nrandom __P((int)); -void printhand __P((int *)); +void printhand __P((const int *)); void printplayer __P((int)); int promove __P((void)); void usage __P((void)) __attribute__((__noreturn__)); @@ -104,6 +106,9 @@ main(argc, argv) { int ch, move; + /* Revoke setgid privileges */ + setgid(getgid()); + while ((ch = getopt(argc, argv, "p")) != -1) switch(ch) { case 'p': @@ -111,8 +116,7 @@ main(argc, argv) break; case '?': default: - (void)fprintf(stderr, "usage: fish [-p]\n"); - exit(1); + usage(); } srandom(time((time_t *)NULL)); @@ -153,7 +157,7 @@ int usermove() { int n; - char **p; + const char *const *p; char buf[256]; (void)printf("\nYour hand is:"); @@ -162,13 +166,13 @@ usermove() for (;;) { (void)printf("You ask me for: "); (void)fflush(stdout); - if (fgets(buf, BUFSIZ, stdin) == NULL) + if (fgets(buf, sizeof(buf), stdin) == NULL) exit(0); if (buf[0] == '\0') continue; if (buf[0] == '\n') { (void)printf("%d cards in my hand, %d in the pool.\n", - countcards(comphand), countcards(deck)); + countcards(comphand), curcard); (void)printf("My books:"); (void)countbooks(comphand); continue; @@ -268,9 +272,7 @@ drawcard(player, hand) { int card; - while (deck[card = nrandom(RANKS)] == 0); - ++hand[card]; - --deck[card]; + ++hand[card = deck[--curcard]]; if (player == USER || hand[card] == CARDS) { printplayer(player); (void)printf("drew %s", cards[card]); @@ -328,7 +330,7 @@ goodmove(player, move, hand, opphand) void chkwinner(player, hand) int player; - int *hand; + const int *hand; { int cb, i, ub; @@ -371,7 +373,7 @@ printplayer(player) void printhand(hand) - int *hand; + const int *hand; { int book, i, j; @@ -392,7 +394,7 @@ printhand(hand) int countcards(hand) - int *hand; + const int *hand; { int i, count; @@ -403,7 +405,7 @@ countcards(hand) int countbooks(hand) - int *hand; + const int *hand; { int i, count; @@ -421,19 +423,21 @@ countbooks(hand) void init() { - int i, rank; + int i, j, temp; - for (i = 0; i < RANKS; ++i) - deck[i] = CARDS; - for (i = 0; i < HANDSIZE; ++i) { - while (!deck[rank = nrandom(RANKS)]); - ++userhand[rank]; - --deck[rank]; + for (i = 0; i < TOTCARDS; ++i) + deck[i] = i % RANKS; + for (i = 0; i < TOTCARDS - 1; ++i) { + j = nrandom(TOTCARDS-i); + if (j == 0) + continue; + temp = deck[i]; + deck[i] = deck[i+j]; + deck[i+j] = temp; } for (i = 0; i < HANDSIZE; ++i) { - while (!deck[rank = nrandom(RANKS)]); - ++comphand[rank]; - --deck[rank]; + ++userhand[deck[--curcard]]; + ++comphand[deck[--curcard]]; } } @@ -450,6 +454,8 @@ instructions() { int input; pid_t pid; + int fd; + const char *pager; int status; (void)printf("Would you like instructions (y or n)? "); @@ -460,10 +466,18 @@ instructions() switch (pid = fork()) { case 0: /* child */ - (void)setuid(getuid()); - (void)setgid(getgid()); - (void)execl(_PATH_MORE, "more", _PATH_INSTR, NULL); - err(1, "%s %s", _PATH_MORE, _PATH_INSTR); + if (!isatty(1)) + pager = "cat"; + else { + if (!(pager = getenv("PAGER")) || (*pager == 0)) + pager = _PATH_MORE; + } + if ((fd = open(_PATH_INSTR, O_RDONLY)) == -1) + err(1, "open %s", _PATH_INSTR); + if (dup2(fd, 0) == -1) + err(1, "dup2"); + (void)execl("/bin/sh", "sh", "-c", pager, NULL); + err(1, "exec sh -c %s", pager); /*NOTREACHED*/ case -1: err(1, "fork");