-/* $NetBSD: main.c,v 1.9 1999/09/08 21:17:57 jsm Exp $ */
+/* $NetBSD: main.c,v 1.24 2008/08/08 16:10:47 drochner 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.24 2008/08/08 16:10:47 drochner Exp $");
#endif
#endif /* not lint */
# include "robots.h"
-int main __P((int, char **));
+int main(int, char **);
+
+extern const char *Scorefile;
+extern int Max_per_uid;
int
main(ac, av)
const char *sp;
bool bad_arg;
bool show_only;
- extern const char *Scorefile;
- extern int Max_per_uid;
+ int score_wfd; /* high score writable file descriptor */
+ int score_err = 0; /* hold errno from score file open */
+
+ score_wfd = open(Scorefile, O_RDWR);
+ if (score_wfd < 0)
+ score_err = errno;
+ else if (score_wfd < 3)
+ exit(1);
+
+ /* Revoke setgid privileges */
+ setgid(getgid());
show_only = FALSE;
Num_games = 1;
bad_arg = FALSE;
for (++av; ac > 1 && *av[0]; av++, ac--)
if (av[0][0] != '-')
- if (isdigit(av[0][0]))
+ if (isdigit((unsigned char)av[0][0]))
Max_per_uid = atoi(av[0]);
else {
- setuid(getuid());
- setgid(getgid());
Scorefile = av[0];
+ if (score_wfd >= 0)
+ close(score_wfd);
+ score_wfd = open(Scorefile, O_RDWR);
+ if (score_wfd < 0)
+ score_err = errno;
# ifdef FANCY
sp = strrchr(Scorefile, '/');
if (sp == NULL)
break;
default:
- fprintf(stderr, "robots: uknown option: %c\n", *sp);
+ fprintf(stderr, "robots: unknown option: %c\n", *sp);
bad_arg = TRUE;
break;
}
/* 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) {
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;
+ int dummy __unused;
{
endwin();
exit(0);