-/* $NetBSD: init.c,v 1.7 1998/11/10 13:01:32 hubertf Exp $ */
+/* $NetBSD: init.c,v 1.18 2008/08/08 16:10:47 drochner Exp $ */
/*
* Copyright (c) 1988, 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.
*
#if 0
static char sccsid[] = "@(#)init.c 8.1 (Berkeley) 5/31/93";
#else
-__RCSID("$NetBSD: init.c,v 1.7 1998/11/10 13:01:32 hubertf Exp $");
+__RCSID("$NetBSD: init.c,v 1.18 2008/08/08 16:10:47 drochner Exp $");
#endif
#endif /* not lint */
*
*/
+#include <stdlib.h>
+#include <fcntl.h>
+
#include "rogue.h"
+static void do_args(int, char **);
+static void do_opts(void);
+static void env_get_value(char **, char *, boolean);
+static void init_str(char **, const char *);
+static void player_init(void);
+
+static char *rest_file = NULL;
+static boolean init_curses = 0;
+
char login_name[MAX_OPT_LEN];
-char *nick_name = (char *) 0;
-char *rest_file = 0;
+char *nick_name = NULL;
boolean cant_int = 0;
boolean did_int = 0;
boolean score_only;
-boolean init_curses = 0;
boolean save_is_interactive = 1;
boolean ask_quit = 1;
boolean no_skull = 0;
boolean passgo = 0;
const char *error_file = "rogue.esave";
const char *byebye_string = "Okay, bye bye!";
+gid_t gid, egid;
int
-init(argc, argv)
- int argc;
- char *argv[];
+init(int argc, char *argv[])
{
const char *pn;
int seed;
+ int fd;
+
+ gid = getgid();
+ egid = getegid();
+ setegid(gid);
+ /* Check for dirty tricks with closed fds 0, 1, 2 */
+ fd = open("/dev/null", O_RDONLY);
+ if (fd < 3)
+ exit(1);
+ close(fd);
seed = 0;
pn = md_gln();
if ((!pn) || (strlen(pn) >= MAX_OPT_LEN)) {
clean_up("Hey! Who are you?");
}
- (void) strcpy(login_name, pn);
+ /* LOGIN_NAME_SIZE == MAX_OPT_LEN now, but just in case... */
+ (void)strlcpy(login_name, pn, sizeof(login_name));
do_args(argc, argv);
do_opts();
fflush(stdout);
}
- initscr();
+ if (!initscr()) {
+ fprintf(stderr, "couldn't initialize screen\n");
+ exit (0);
+ }
if ((LINES < DROWS) || (COLS < DCOLS)) {
- clean_up("must be played on 24 x 80 screen");
+ clean_up("must be played on at least 80 x 24 screen");
}
start_window();
init_curses = 1;
md_heed_signals();
if (score_only) {
- put_scores((object *) 0, 0);
+ put_scores(NULL, 0);
}
seed = md_gseed();
- (void) srrandom(seed);
+ (void)srrandom(seed);
if (rest_file) {
restore(rest_file);
return(1);
get_wand_and_ring_materials();
make_scroll_titles();
- level_objects.next_object = (object *) 0;
- level_monsters.next_monster = (object *) 0;
+ level_objects.next_object = NULL;
+ level_monsters.next_monster = NULL;
player_init();
ring_stats(0);
return(0);
}
-void
-player_init()
+static void
+player_init(void)
{
object *obj;
- rogue.pack.next_object = (object *) 0;
+ rogue.pack.next_object = NULL;
obj = alloc_object();
get_food(obj, 1);
- (void) add_to_pack(obj, &rogue.pack, 1);
+ (void)add_to_pack(obj, &rogue.pack, 1);
obj = alloc_object(); /* initial armor */
obj->what_is = ARMOR;
obj->class = RINGMAIL+2;
obj->is_protected = 0;
obj->d_enchant = 1;
- (void) add_to_pack(obj, &rogue.pack, 1);
+ (void)add_to_pack(obj, &rogue.pack, 1);
do_wear(obj);
obj = alloc_object(); /* initial weapons */
obj->damage = "2d3";
obj->hit_enchant = obj->d_enchant = 1;
obj->identified = 1;
- (void) add_to_pack(obj, &rogue.pack, 1);
+ (void)add_to_pack(obj, &rogue.pack, 1);
do_wield(obj);
obj = alloc_object();
obj->hit_enchant = 1;
obj->d_enchant = 0;
obj->identified = 1;
- (void) add_to_pack(obj, &rogue.pack, 1);
+ (void)add_to_pack(obj, &rogue.pack, 1);
obj = alloc_object();
obj->what_is = WEAPON;
obj->hit_enchant = 0;
obj->d_enchant = 0;
obj->identified = 1;
- (void) add_to_pack(obj, &rogue.pack, 1);
+ (void)add_to_pack(obj, &rogue.pack, 1);
}
void
-clean_up(estr)
- const char *estr;
+clean_up(const char *estr)
{
if (save_is_interactive) {
if (init_curses) {
}
void
-start_window()
+start_window(void)
{
- crmode();
+ cbreak();
noecho();
#ifndef BAD_NONL
nonl();
}
void
-stop_window()
+stop_window(void)
{
endwin();
}
void
-byebye(dummy)
- int dummy;
+byebye(int dummy __unused)
{
md_ignore_signals();
if (ask_quit) {
}
void
-onintr(dummy)
- int dummy;
+onintr(int dummy __unused)
{
md_ignore_signals();
if (cant_int) {
did_int = 1;
} else {
check_message();
- message("interrupt", 1);
+ messagef(1, "interrupt");
}
md_heed_signals();
}
void
-error_save(dummy)
- int dummy;
+error_save(int dummy __unused)
{
save_is_interactive = 0;
save_into_file(error_file);
clean_up("");
}
-void
-do_args(argc, argv)
- int argc;
- char *argv[];
+static void
+do_args(int argc, char *argv[])
{
- short i, j;
+ int i, j;
for (i = 1; i < argc; i++) {
if (argv[i][0] == '-') {
}
}
-void
-do_opts()
+static void
+do_opts(void)
{
char *eptr;
init_str(&fruit, "slime-mold");
}
-void
-env_get_value(s, e, add_blank)
- char **s, *e;
- boolean add_blank;
+static void
+env_get_value(char **s, char *e, boolean add_blank)
{
short i = 0;
const char *t;
break;
}
}
+ /* note: edit_opts() in room.c depends on this being the right size */
*s = md_malloc(MAX_OPT_LEN + 2);
- (void) strncpy(*s, t, i);
+ if (*s == NULL)
+ clean_up("out of memory");
+ (void)strncpy(*s, t, i);
if (add_blank) {
(*s)[i++] = ' ';
}
(*s)[i] = '\0';
}
-void
-init_str(str, dflt)
- char **str;
- const char *dflt;
+static void
+init_str(char **str, const char *dflt)
{
if (!(*str)) {
+ /* note: edit_opts() in room.c depends on this size */
*str = md_malloc(MAX_OPT_LEN + 2);
- (void) strcpy(*str, dflt);
+ if (*str == NULL)
+ clean_up("out of memory");
+ (void)strlcpy(*str, dflt, MAX_OPT_LEN + 2);
}
}