-/* $NetBSD: crib.c,v 1.5 1995/03/21 15:08:42 cgd Exp $ */
+/* $NetBSD: crib.c,v 1.20 2005/07/02 08:32:32 jmc Exp $ */
/*-
* Copyright (c) 1980, 1993
* 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 copyright[] =
-"@(#) Copyright (c) 1980, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
+__COPYRIGHT("@(#) Copyright (c) 1980, 1993\n\
+ The Regents of the University of California. All rights reserved.\n");
#endif /* not lint */
#ifndef lint
#if 0
static char sccsid[] = "@(#)crib.c 8.1 (Berkeley) 5/31/93";
#else
-static char rcsid[] = "$NetBSD: crib.c,v 1.5 1995/03/21 15:08:42 cgd Exp $";
+__RCSID("$NetBSD: crib.c,v 1.20 2005/07/02 08:32:32 jmc Exp $");
#endif
#endif /* not lint */
#include <curses.h>
+#include <err.h>
+#include <fcntl.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include "pathnames.h"
int
-main(argc, argv)
- int argc;
- char *argv[];
+main(int argc, char *argv[])
{
BOOLEAN playing;
FILE *f;
int ch;
+ int fd;
+ int flags;
- while ((ch = getopt(argc, argv, "eqr")) != EOF)
+ f = fopen(_PATH_LOG, "a");
+ if (f == NULL)
+ warn("fopen %s", _PATH_LOG);
+ if (f != NULL && fileno(f) < 3)
+ exit(1);
+
+ /* Revoke setgid privileges */
+ setgid(getgid());
+
+ /* Set close-on-exec flag on log file */
+ if (f != NULL) {
+ fd = fileno(f);
+ flags = fcntl(fd, F_GETFD);
+ if (flags < 0)
+ err(1, "fcntl F_GETFD");
+ flags |= FD_CLOEXEC;
+ if (fcntl(fd, F_SETFD, flags) == -1)
+ err(1, "fcntl F_SETFD");
+ }
+
+ while ((ch = getopt(argc, argv, "eqr")) != -1)
switch (ch) {
case 'e':
explain = TRUE;
}
initscr();
- (void)signal(SIGINT, rint);
- crmode();
+ (void)signal(SIGINT, receive_intr);
+ cbreak();
noecho();
Playwin = subwin(stdscr, PLAY_Y, PLAY_X, 0, 0);
mvcur(0, COLS - 1, LINES - 1, 0);
fflush(stdout);
instructions();
- crmode();
+ cbreak();
noecho();
clear();
refresh();
playing = (getuchar() == 'Y');
} while (playing);
- if (f = fopen(_PATH_LOG, "a")) {
+ if (f != NULL) {
(void)fprintf(f, "%s: won %5.5d, lost %5.5d\n",
getlogin(), cgames, pgames);
(void) fclose(f);
}
bye();
- if (!f) {
- (void) fprintf(stderr, "\ncribbage: can't open %s.\n",
- _PATH_LOG);
- exit(1);
- }
exit(0);
}
* Print out the initial board on the screen
*/
void
-makeboard()
+makeboard(void)
{
mvaddstr(SCORE_Y + 0, SCORE_X,
"+---------------------------------------+");
* Print out the current game score
*/
void
-gamescore()
+gamescore(void)
{
- extern int Lastscore[];
-
if (pgames || cgames) {
mvprintw(SCORE_Y + 1, SCORE_X + 28, "Games: %3d", pgames);
mvprintw(SCORE_Y + 7, SCORE_X + 28, "Games: %3d", cgames);
* player what card to turn. We do a random one, anyway.
*/
void
-game()
+game(void)
{
- register int i, j;
+ int i, j;
BOOLEAN flag;
BOOLEAN compcrib;
+ compcrib = FALSE;
makedeck(deck);
shuffle(deck);
if (gamecount == 0) {
} else
compcrib = (deck[i].rank > deck[j].rank);
} while (flag);
+ do_wait();
clear();
makeboard();
refresh();
} else {
+ makeboard();
+ refresh();
werase(Tablewin);
wrefresh(Tablewin);
werase(Compwin);
* Do up one hand of the game
*/
int
-playhand(mycrib)
- BOOLEAN mycrib;
+playhand(BOOLEAN mycrib)
{
- register int deckpos;
+ int deckpos;
werase(Compwin);
+ wrefresh(Compwin);
+ werase(Tablewin);
+ wrefresh(Tablewin);
knownum = 0;
deckpos = deal(mycrib);
* deal cards to both players from deck
*/
int
-deal(mycrib)
- BOOLEAN mycrib;
+deal(BOOLEAN mycrib)
{
- register int i, j;
+ int i, j;
for (i = j = 0; i < FULLHAND; i++) {
if (mycrib) {
* Note: we call cdiscard() after prining first message so player doesn't wait
*/
void
-discard(mycrib)
- BOOLEAN mycrib;
+discard(BOOLEAN mycrib)
{
- register char *prompt;
+ const char *prompt;
CARD crd;
prcrib(mycrib, TRUE);
* player what card to turn. We do a random one, anyway.
*/
int
-cut(mycrib, pos)
- BOOLEAN mycrib;
- int pos;
+cut(BOOLEAN mycrib, int pos)
{
- register int i;
+ int i;
BOOLEAN win;
win = FALSE;
* Print out the turnover card with crib indicator
*/
void
-prcrib(mycrib, blank)
- BOOLEAN mycrib, blank;
+prcrib(BOOLEAN mycrib, BOOLEAN blank)
{
- register int y, cardx;
+ int y, cardx;
if (mycrib)
cardx = CRIB_X;
for (y = CRIB_Y; y <= CRIB_Y + 5; y++)
mvaddstr(y, cardx, " ");
+ refresh();
}
/*
static int Tcnt;
int
-peg(mycrib)
- BOOLEAN mycrib;
+peg(BOOLEAN mycrib)
{
static CARD ch[CINHAND], ph[CINHAND];
- register int i, j, k;
- register int l;
- register int cnum, pnum, sum;
- register BOOLEAN myturn, mego, ugo, last, played;
+ int i, j, k;
+ int l;
+ int cnum, pnum, sum;
+ BOOLEAN myturn, mego, ugo, last, played;
CARD crd;
+ played = FALSE;
cnum = pnum = CINHAND;
for (i = 0; i < CINHAND; i++) { /* make copies of hands */
ch[i] = chand[i];
else { /* give him his point */
msg(quiet ? "You get one" :
"You get one point");
+ do_wait();
if (chkscr(&pscore, 1))
return TRUE;
sum = 0;
if (i > 0) {
msg(quiet ? "You got %d" :
"You got %d points", i);
+ if (pnum == 0)
+ do_wait();
if (chkscr(&pscore, i))
return TRUE;
}
prhand(ph, pnum, Playwin, FALSE);
prhand(ch, cnum, Compwin, TRUE);
prtable(sum);
- if (last)
+ if (last) {
if (played) {
msg(quiet ? "I get one for last" :
"I get one point for last");
} else {
msg(quiet ? "You get one for last" :
"You get one point for last");
+ do_wait();
if (chkscr(&pscore, 1))
return TRUE;
}
+ }
return (FALSE);
}
* Print out the table with the current score
*/
void
-prtable(score)
- int score;
+prtable(int curscore)
{
prhand(Table, Tcnt, Tablewin, FALSE);
- mvwprintw(Tablewin, (Tcnt + 2) * 2, Tcnt + 1, "%2d", score);
+ mvwprintw(Tablewin, (Tcnt + 2) * 2, Tcnt + 1, "%2d", curscore);
wrefresh(Tablewin);
}
* Handle the scoring of the hands
*/
int
-score(mycrib)
- BOOLEAN mycrib;
+score(BOOLEAN mycrib)
{
sorthand(crib, CINHAND);
if (mycrib) {
do_wait();
if (comphand(crib, "crib"))
return (TRUE);
+ do_wait();
} else {
if (comphand(chand, "hand"))
return (TRUE);