-/* $NetBSD: main.c,v 1.9 1999/09/08 21:17:57 jsm Exp $ */
+/* $NetBSD: main.c,v 1.33 2020/07/26 15:38:22 nia 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.
*
#include <sys/cdefs.h>
#ifndef lint
-__COPYRIGHT("@(#) Copyright (c) 1980, 1993\n\
- The Regents of the University of California. All rights reserved.\n");
+__COPYRIGHT("@(#) Copyright (c) 1980, 1993\
+ The Regents of the University of California. All rights reserved.");
#endif /* not lint */
#ifndef lint
#if 0
static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 5/31/93";
#else
-__RCSID("$NetBSD: main.c,v 1.9 1999/09/08 21:17:57 jsm Exp $");
+__RCSID("$NetBSD: main.c,v 1.33 2020/07/26 15:38:22 nia Exp $");
#endif
#endif /* not lint */
-# include "robots.h"
+#include <ctype.h>
+#include <curses.h>
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <time.h>
+#include <unistd.h>
+#include "robots.h"
-int main __P((int, char **));
+extern const char *Scorefile;
+extern int Max_per_uid;
+
+static bool another(void);
int
-main(ac, av)
- int ac;
- char **av;
+main(int argc, char **argv)
{
- const char *sp;
- bool bad_arg;
- bool show_only;
- extern const char *Scorefile;
- extern int Max_per_uid;
+ const char *word;
+ bool show_only;
+ int score_wfd; /* high score writable file descriptor */
+ int score_err = 0; /* hold errno from score file open */
+ int maximum = 0;
+ int ch, i;
+
+ score_wfd = open(Scorefile, O_RDWR);
+ if (score_wfd < 0)
+ score_err = errno;
+ else if (score_wfd < 3)
+ exit(1);
- show_only = FALSE;
+ /* Revoke setgid privileges */
+ setgid(getgid());
+
+ show_only = false;
Num_games = 1;
- if (ac > 1) {
- bad_arg = FALSE;
- for (++av; ac > 1 && *av[0]; av++, ac--)
- if (av[0][0] != '-')
- if (isdigit(av[0][0]))
- Max_per_uid = atoi(av[0]);
- else {
- setuid(getuid());
- setgid(getgid());
- Scorefile = av[0];
-# ifdef FANCY
- sp = strrchr(Scorefile, '/');
- if (sp == NULL)
- sp = Scorefile;
- if (strcmp(sp, "pattern_roll") == 0)
- Pattern_roll = TRUE;
- else if (strcmp(sp, "stand_still") == 0)
- Stand_still = TRUE;
- if (Pattern_roll || Stand_still)
- Teleport = TRUE;
-# endif
- }
- else
- for (sp = &av[0][1]; *sp; sp++)
- switch (*sp) {
- case 'A':
- Auto_bot = TRUE;
- break;
- case 's':
- show_only = TRUE;
- break;
- case 'r':
- Real_time = TRUE;
- break;
- case 'a':
- Start_level = 4;
- break;
- case 'n':
- Num_games++;
- break;
- case 'j':
- Jump = TRUE;
- break;
- case 't':
- Teleport = TRUE;
- break;
-
- default:
- fprintf(stderr, "robots: uknown option: %c\n", *sp);
- bad_arg = TRUE;
- break;
- }
- if (bad_arg) {
- exit(1);
- /* NOTREACHED */
+
+ while ((ch = getopt(argc, argv, "Aajnrst")) != -1) {
+ switch (ch) {
+ case 'A':
+ Auto_bot = true;
+ break;
+ case 'a':
+ Start_level = 4;
+ break;
+ case 'j':
+ Jump = true;
+ break;
+ case 'n':
+ Num_games++;
+ break;
+ case 'r':
+ Real_time = true;
+ break;
+ case 's':
+ show_only = true;
+ break;
+ case 't':
+ Teleport = true;
+ break;
+ default:
+ errx(1,
+ "Usage: robots [-Aajnrst] [maximum] [scorefile]");
+ break;
+ }
+ }
+
+ for (i = optind; i < argc; i++) {
+ word = argv[i];
+ if (isdigit((unsigned char)word[0])) {
+ maximum = atoi(word);
+ } else {
+ Scorefile = word;
+ Max_per_uid = maximum;
+ if (score_wfd >= 0)
+ close(score_wfd);
+ score_wfd = open(Scorefile, O_RDWR);
+ if (score_wfd < 0)
+ score_err = errno;
+#ifdef FANCY
+ word = strrchr(Scorefile, '/');
+ if (word == NULL)
+ word = Scorefile;
+ if (strcmp(word, "pattern_roll") == 0)
+ Pattern_roll = true;
+ else if (strcmp(word, "stand_still") == 0)
+ Stand_still = true;
+ if (Pattern_roll || Stand_still)
+ Teleport = true;
+#endif
}
}
/* NOTREACHED */
}
- initscr();
+ if (score_wfd < 0) {
+ errno = score_err;
+ warn("%s", Scorefile);
+ warnx("High scores will not be recorded!");
+ sleep(2);
+ }
+
+ if (!initscr())
+ errx(0, "couldn't initialize screen");
signal(SIGINT, quit);
- crmode();
+ cbreak();
noecho();
nonl();
if (LINES != Y_SIZE || COLS != X_SIZE) {
stdscr = newwin(Y_SIZE, X_SIZE, 0, 0);
}
- srand(getpid());
if (Real_time)
signal(SIGALRM, move_robots);
do {
refresh();
if (Auto_bot)
sleep(1);
- score();
+ score(score_wfd);
if (Auto_bot)
sleep(1);
refresh();
}
+ Num_games = 1;
} while (!Auto_bot && another());
quit(0);
/* NOTREACHED */
return(0);
}
-void
-__cputchar(ch)
- int ch;
-{
- (void)putchar(ch);
-}
-
/*
* quit:
* Leave the program elegantly.
*/
void
-quit(dummy)
- int dummy;
+quit(int dummy __unused)
{
endwin();
exit(0);
* another:
* See if another game is desired
*/
-bool
-another()
+static bool
+another(void)
{
- int y;
+ int y;
-#ifdef FANCY
+#ifdef FANCY
if ((Stand_still || Pattern_roll) && !Newscore)
- return TRUE;
+ return true;
#endif
if (query("Another game?")) {
}
refresh();
}
- return TRUE;
+ return true;
}
- return FALSE;
+ return false;
}