]> git.cameronkatri.com Git - bsdgames-darwin.git/blobdiff - rogue/init.c
s/saftey/safety/
[bsdgames-darwin.git] / rogue / init.c
index f06ca3b4ae96bc765034ab27ce06cd0639810dad..982a95cb8d211fc1bc10f09e118e52896586727c 100644 (file)
@@ -1,4 +1,4 @@
-/*     $NetBSD: init.c,v 1.9 1999/09/09 17:27:59 jsm 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.
  *
@@ -41,7 +37,7 @@
 #if 0
 static char sccsid[] = "@(#)init.c     8.1 (Berkeley) 5/31/93";
 #else
-__RCSID("$NetBSD: init.c,v 1.9 1999/09/09 17:27:59 jsm Exp $");
+__RCSID("$NetBSD: init.c,v 1.18 2008/08/08 16:10:47 drochner Exp $");
 #endif
 #endif /* not lint */
 
@@ -57,36 +53,56 @@ __RCSID("$NetBSD: init.c,v 1.9 1999/09/09 17:27:59 jsm Exp $");
  *
  */
 
+#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();
@@ -97,9 +113,12 @@ init(argc, argv)
                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;
@@ -107,10 +126,10 @@ init(argc, argv)
        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);
@@ -119,23 +138,23 @@ init(argc, argv)
        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;
@@ -143,7 +162,7 @@ player_init()
        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 */
@@ -152,7 +171,7 @@ player_init()
        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();
@@ -162,7 +181,7 @@ player_init()
        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;
@@ -172,12 +191,11 @@ player_init()
        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) {
@@ -191,9 +209,9 @@ clean_up(estr)
 }
 
 void
-start_window()
+start_window(void)
 {
-       crmode();
+       cbreak();
        noecho();
 #ifndef BAD_NONL
        nonl();
@@ -201,14 +219,13 @@ start_window()
 }
 
 void
-stop_window()
+stop_window(void)
 {
        endwin();
 }
 
 void
-byebye(dummy)
-       int dummy __attribute__((__unused__));
+byebye(int dummy __unused)
 {
        md_ignore_signals();
        if (ask_quit) {
@@ -220,34 +237,30 @@ byebye(dummy)
 }
 
 void
-onintr(dummy)
-       int dummy __attribute__((__unused__));
+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 __attribute__((__unused__));
+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] == '-') {
@@ -264,8 +277,8 @@ do_args(argc, argv)
        }
 }
 
-void
-do_opts()
+static void
+do_opts(void)
 {
        char *eptr;
 
@@ -312,10 +325,8 @@ do_opts()
        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;
@@ -331,25 +342,25 @@ env_get_value(s, e, add_blank)
                        break;
                }
        }
+       /* note: edit_opts() in room.c depends on this being the right size */
        *s = md_malloc(MAX_OPT_LEN + 2);
        if (*s == NULL)
                clean_up("out of memory");
-       (void) strncpy(*s, t, i);
+       (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);
                if (*str == NULL)
                        clean_up("out of memory");
-               (void) strcpy(*str, dflt);
+               (void)strlcpy(*str, dflt, MAX_OPT_LEN + 2);
        }
 }