]> granicus.if.org Git - nethack/commitdiff
sys/unix/*.c formatting and PANICTRACE fix
authorPatR <rankin@nethack.org>
Wed, 13 Sep 2017 22:33:43 +0000 (15:33 -0700)
committerPatR <rankin@nethack.org>
Wed, 13 Sep 2017 22:33:43 +0000 (15:33 -0700)
I started out just reformatting the function header for regularize()
but ended up doing miscellaneous other stuff, including some code
changes.  I think the CHDIR code is a bit cleaner now, but shouldn't
have any differences in behavior.

Along the way I noticed that 'nethack -dpath' or 'nethack -d path'
modifies argv[] before PANICTRACE attempted to save argv[0], so would
break having nethack invoke gdb to get a backtrace.  ('ARGV0' seems to
be unnecessary since 'hname' holds the same value, but I didn't get rid
of it....)

doc/fixes36.1
include/decl.h
src/decl.c
sys/unix/unixmain.c
sys/unix/unixres.c
sys/unix/unixunix.c

index 01b5df77274f2908f5c497b917dcc1c6137da14a..a481a914b66951a406cbd7e5f42f0f20e2602f4a 100644 (file)
@@ -547,6 +547,8 @@ X11: color didn't work when the map was displayed as text rather than tiles
 X11: use grayscale monster tiles for statues
 X11/USE_XPM: [post-3.6.0 issue] the 'tiles' bug of incorrect total_tiles_used
        for STATUES_LOOK_LIKE_MONSTERS broke XPM manipulation of tiles data
+PANICTRACE: PANICTRACE_GDB used wrong value for ARGV0 when launching gdb if
+       'nethack -dpath' was used to specify non-default playground directory
 
 
 General New Features
index b289b83cb06f36caa0732b0f7296bc98416bfb9d..d26b75dd00266c4e15a991a00b9eaded65c1fae8 100644 (file)
@@ -421,7 +421,7 @@ struct plinemsg_type {
 E struct plinemsg_type *plinemsg_types;
 
 #ifdef PANICTRACE
-E char *ARGV0;
+E const char *ARGV0;
 #endif
 
 #undef E
index 479c075aae1031d433dbf541d9a852f511edb903..77ed16bbff72f7148f5b8c168b4e85a4b200c019 100644 (file)
@@ -333,7 +333,7 @@ NEARDATA struct savefile_info sfrestinfo, sfsaveinfo = {
 struct plinemsg_type *plinemsg_types = (struct plinemsg_type *) 0;
 
 #ifdef PANICTRACE
-char *ARGV0;
+const char *ARGV0;
 #endif
 
 /* support for lint.h */
index c106914440759e32c66f8ee3d8565f2cb197163e..2270ab26200bd65597023b1e1da10c3e29f5d754 100644 (file)
@@ -97,19 +97,18 @@ char *argv[];
     choose_windows(DEFAULT_WINDOW_SYS);
 
 #ifdef CHDIR /* otherwise no chdir() */
-             /*
-              * See if we must change directory to the playground.
-              * (Perhaps hack runs suid and playground is inaccessible
-              *  for the player.)
-              * The environment variable HACKDIR is overridden by a
-              *  -d command line option (must be the first option given)
-              */
+    /*
+     * See if we must change directory to the playground.
+     * (Perhaps hack runs suid and playground is inaccessible
+     *  for the player.)
+     * The environment variable HACKDIR is overridden by a
+     *  -d command line option (must be the first option given).
+     */
     dir = nh_getenv("NETHACKDIR");
     if (!dir)
         dir = nh_getenv("HACKDIR");
-#endif
+
     if (argc > 1) {
-#ifdef CHDIR
         if (!strncmp(argv[1], "-d", 2) && argv[1][2] != 'e') {
             /* avoid matching "-dec" for DECgraphics; since the man page
              * says -d directory, hope nobody's using -desomething_else
@@ -127,30 +126,33 @@ char *argv[];
             if (!*dir)
                 error("Flag -d must be followed by a directory name.");
         }
-        if (argc > 1)
+    }
 #endif /* CHDIR */
 
-            /*
-             * Now we know the directory containing 'record' and
-             * may do a prscore().  Exclude `-style' - it's a Qt option.
-             */
-            if (!strncmp(argv[1], "-s", 2) && strncmp(argv[1], "-style", 6)) {
+    if (argc > 1) {
+        /*
+         * Now we know the directory containing 'record' and
+         * may do a prscore().  Exclude `-style' - it's a Qt option.
+         */
+        if (!strncmp(argv[1], "-s", 2) && strncmp(argv[1], "-style", 6)) {
 #ifdef CHDIR
-                chdirx(dir, 0);
+            chdirx(dir, 0);
 #endif
 #ifdef SYSCF
-                initoptions();
+            initoptions();
 #endif
 #ifdef PANICTRACE
-                ARGV0 = argv[0]; /* save for possible stack trace */
+            ARGV0 = hname; /* save for possible stack trace */
 #ifndef NO_SIGNAL
-                panictrace_setsignals(TRUE);
+            panictrace_setsignals(TRUE);
 #endif
 #endif
-                prscore(argc, argv);
-                exit(EXIT_SUCCESS);
-            }
-    }
+            prscore(argc, argv);
+            /* FIXME: shouldn't this be using nh_terminate() to free
+               up any memory allocated by initoptions() */
+            exit(EXIT_SUCCESS);
+        }
+    } /* argc > 1 */
 
 /*
  * Change directories before we initialize the window system so
@@ -168,7 +170,7 @@ char *argv[];
 #endif
     initoptions();
 #ifdef PANICTRACE
-    ARGV0 = argv[0]; /* save for possible stack trace */
+    ARGV0 = hname; /* save for possible stack trace */
 #ifndef NO_SIGNAL
     panictrace_setsignals(TRUE);
 #endif
@@ -217,7 +219,7 @@ char *argv[];
          * dash matches role, race, gender, or alignment.
          */
         /* guard against user names with hyphens in them */
-        int len = strlen(plname);
+        int len = (int) strlen(plname);
         /* append the current role, if any, so that last dash is ours */
         if (++len < (int) sizeof plname)
             (void) strncat(strcat(plname, "-"), pl_character,
@@ -252,17 +254,17 @@ char *argv[];
     dlb_init(); /* must be before newgame() */
 
     /*
-     *  Initialize the vision system.  This must be before mklev() on a
-     *  new game or before a level restore on a saved game.
+     * Initialize the vision system.  This must be before mklev() on a
+     * new game or before a level restore on a saved game.
      */
     vision_init();
 
     display_gamewindows();
 
-/*
- * First, try to find and restore a save file for specified character.
- * We'll return here if new game player_selection() renames the hero.
- */
+    /*
    * First, try to find and restore a save file for specified character.
    * We'll return here if new game player_selection() renames the hero.
    */
 attempt_restore:
     if ((fd = restore_saved_game()) >= 0) {
         const char *fq_save = fqname(SAVEF, SAVEPREFIX, 1);
@@ -283,9 +285,10 @@ attempt_restore:
             resuming = TRUE; /* not starting new game */
             wd_message();
             if (discover || wizard) {
-                if (yn("Do you want to keep the save file?") == 'n')
+                /* this seems like a candidate for paranoid_confirmation... */
+                if (yn("Do you want to keep the save file?") == 'n') {
                     (void) delete_savefile();
-                else {
+                else {
                     (void) chmod(fq_save, FCMASK); /* back to readable */
                     nh_compress(fq_save);
                 }
@@ -316,10 +319,12 @@ attempt_restore:
         wd_message();
     }
 
+    /* moveloop() never returns but isn't flagged NORETURN */
     moveloop(resuming);
+
     exit(EXIT_SUCCESS);
     /*NOTREACHED*/
-    return (0);
+    return 0;
 }
 
 static void
@@ -363,14 +368,15 @@ char *argv[];
             break;
 #endif
         case 'u':
-            if (argv[0][2])
-                (void) strncpy(plname, argv[0] + 2, sizeof(plname) - 1);
-            else if (argc > 1) {
+            if (argv[0][2]) {
+                (void) strncpy(plname, argv[0] + 2, sizeof plname - 1);
+            else if (argc > 1) {
                 argc--;
                 argv++;
-                (void) strncpy(plname, argv[0], sizeof(plname) - 1);
-            } else
+                (void) strncpy(plname, argv[0], sizeof plname - 1);
+            } else {
                 raw_print("Player name expected after -u");
+            }
             break;
         case 'I':
         case 'i':
@@ -457,10 +463,10 @@ boolean wr;
         (void) setuid(getuid()); /* Ron Wessels */
 #endif
     } else {
-/* non-default data files is a sign that scores may not be
- * compatible, or perhaps that a binary not fitting this
- * system's layout is being used.
- */
+        /* non-default data files is a sign that scores may not be
        * compatible, or perhaps that a binary not fitting this
        * system's layout is being used.
        */
 #ifdef VAR_PLAYGROUND
         int len = strlen(VAR_PLAYGROUND);
 
@@ -483,9 +489,10 @@ boolean wr;
         error("Cannot chdir to %s.", dir);
     }
 
-    /* warn the player if we can't write the record file */
-    /* perhaps we should also test whether . is writable */
-    /* unfortunately the access system-call is worthless */
+    /* warn the player if we can't write the record file
+     * perhaps we should also test whether . is writable
+     * unfortunately the access system-call is worthless.
+     */
     if (wr) {
 #ifdef VAR_PLAYGROUND
         fqn_prefix[LEVELPREFIX] = fqn_prefix[SCOREPREFIX];
@@ -576,6 +583,7 @@ boolean
 authorize_wizard_mode()
 {
     struct passwd *pw = get_unix_pw();
+
     if (pw && sysopt.wizards && sysopt.wizards[0]) {
         if (check_user_string(sysopt.wizards))
             return TRUE;
@@ -628,6 +636,7 @@ char *optstr;
     int pwlen;
     char *eop, *w;
     char *pwname;
+
     if (optstr[0] == '*')
         return TRUE; /* allow any user */
     if (!pw)
index c60df76694c5fb4e596c309362725949af4975db..cd0954a1fc8dd8e9466cf372c57edd78dfc4eedb 100644 (file)
@@ -33,7 +33,7 @@ uid_t *ruid, *euid, *suid;
     if (!f)
         return -1;
 
-    return f(ruid, euid, suid);
+    return (*f)(ruid, euid, suid);
 }
 
 static int
@@ -46,7 +46,7 @@ gid_t *rgid, *egid, *sgid;
     if (!f)
         return -1;
 
-    return f(rgid, egid, sgid);
+    return (*f)(rgid, egid, sgid);
 }
 
 #else
@@ -74,6 +74,7 @@ uid_t *ruid, *euid, *suid;
     int retval;
     int pfd[2];
     struct stat st;
+
     if (pipe(pfd))
         return -1;
     retval = fstat(pfd[0], &st);
@@ -107,6 +108,7 @@ gid_t *rgid, *egid, *sgid;
     int retval;
     int pfd[2];
     struct stat st;
+
     if (pipe(pfd))
         return -1;
     retval = fstat(pfd[0], &st);
@@ -146,6 +148,7 @@ nh_getresuid(ruid, euid, suid)
 uid_t *ruid, *euid, *suid;
 {
     int retval = real_getresuid(ruid, euid, suid);
+
     if (!retval && hiding_privileges)
         *euid = *suid = *ruid;
     return retval;
@@ -155,6 +158,7 @@ uid_t
 nh_getuid()
 {
     uid_t ruid, euid, suid;
+
     (void) real_getresuid(&ruid, &euid, &suid);
     return ruid;
 }
@@ -163,6 +167,7 @@ uid_t
 nh_geteuid()
 {
     uid_t ruid, euid, suid;
+
     (void) real_getresuid(&ruid, &euid, &suid);
     if (hiding_privileges)
         euid = ruid;
@@ -174,6 +179,7 @@ nh_getresgid(rgid, egid, sgid)
 gid_t *rgid, *egid, *sgid;
 {
     int retval = real_getresgid(rgid, egid, sgid);
+
     if (!retval && hiding_privileges)
         *egid = *sgid = *rgid;
     return retval;
@@ -183,6 +189,7 @@ gid_t
 nh_getgid()
 {
     gid_t rgid, egid, sgid;
+
     (void) real_getresgid(&rgid, &egid, &sgid);
     return rgid;
 }
@@ -191,6 +198,7 @@ gid_t
 nh_getegid()
 {
     gid_t rgid, egid, sgid;
+
     (void) real_getresgid(&rgid, &egid, &sgid);
     if (hiding_privileges)
         egid = rgid;
index d02d70c6366c0a88298876212d36077d2c755a47..9c4f312b3c91cce3bdb6c2195616c34623a2bbd8 100644 (file)
@@ -28,7 +28,8 @@ extern int errno;
 
 static struct stat buf;
 
-/* see whether we should throw away this xlock file */
+/* see whether we should throw away this xlock file;
+   if yes, close it, otherwise leave it open */
 static int
 veryold(fd)
 int fd;
@@ -36,10 +37,10 @@ int fd;
     time_t date;
 
     if (fstat(fd, &buf))
-        return (0); /* cannot get status */
+        return 0; /* cannot get status */
 #ifndef INSURANCE
-    if (buf.st_size != sizeof(int))
-        return (0); /* not an xlock file */
+    if (buf.st_size != sizeof (int))
+        return 0; /* not an xlock file */
 #endif
 #if defined(BSD) && !defined(POSIX_TYPES)
     (void) time((long *) (&date));
@@ -49,10 +50,10 @@ int fd;
     if (date - buf.st_mtime < 3L * 24L * 60L * 60L) { /* recent */
         int lockedpid; /* should be the same size as hackpid */
 
-        if (read(fd, (genericptr_t) &lockedpid, sizeof(lockedpid))
-            != sizeof(lockedpid))
+        if (read(fd, (genericptr_t) &lockedpid, sizeof lockedpid)
+            != sizeof lockedpid)
             /* strange ... */
-            return (0);
+            return 0;
 
 /* From: Rick Adams <seismo!rick> */
 /* This will work on 4.1cbsd, 4.2bsd and system 3? & 5. */
@@ -62,10 +63,10 @@ int fd;
            by more than one machine! -pem */
         if (!(kill(lockedpid, 0) == -1 && errno == ESRCH))
 #endif
-            return (0);
+            return 0;
     }
     (void) close(fd);
-    return (1);
+    return 1;
 }
 
 static int
@@ -85,8 +86,8 @@ eraseoldlocks()
     }
     set_levelfile_name(lock, 0);
     if (unlink(fqname(lock, LEVELPREFIX, 0)))
-        return (0); /* cannot remove it */
-    return (1);     /* success! */
+        return 0; /* cannot remove it */
+    return 1;     /* success! */
 }
 
 void
@@ -139,8 +140,8 @@ getlock()
                 error("Cannot open %s", fq_lock);
             }
 
-            if (veryold(fd) /* closes fd if true */
-                && eraseoldlocks())
+            /* veryold() closes fd if true */
+            if (veryold(fd) && eraseoldlocks())
                 goto gotlock;
             (void) close(fd);
         } while (i < locknum);
@@ -157,17 +158,20 @@ getlock()
             error("Cannot open %s", fq_lock);
         }
 
-        if (veryold(fd) /* closes fd if true */ && eraseoldlocks())
+        /* veryold() closes fd if true */
+        if (veryold(fd) && eraseoldlocks())
             goto gotlock;
         (void) close(fd);
 
+      {
+        const char destroy_old_game_prompt[] =
+    "There is already a game in progress under your name.  Destroy old game?";
+
         if (iflags.window_inited) {
-            c = yn("There is already a game in progress under your name.  "
-                   "Destroy old game?");
+            /* this is a candidate for paranoid_confirmation */
+            c = yn(destroy_old_game_prompt);
         } else {
-            (void) printf(
-                "\nThere is already a game in progress under your name.");
-            (void) printf("  Destroy old game? [yn] ");
+            (void) printf("\n%s [yn] ", destroy_old_game_prompt);
             (void) fflush(stdout);
             if ((c = getchar()) != EOF) {
                 int tmp;
@@ -178,10 +182,11 @@ getlock()
                     ; /* eat rest of line and newline */
             }
         }
+      }
         if (c == 'y' || c == 'Y') {
-            if (eraseoldlocks())
+            if (eraseoldlocks()) {
                 goto gotlock;
-            else {
+            else {
                 unlock_file(HLOCK);
                 error("Couldn't destroy old game.");
             }
@@ -197,8 +202,8 @@ gotlock:
     if (fd == -1) {
         error("cannot creat lock file (%s).", fq_lock);
     } else {
-        if (write(fd, (genericptr_t) &hackpid, sizeof(hackpid))
-            != sizeof(hackpid)) {
+        if (write(fd, (genericptr_t) &hackpid, sizeof hackpid)
+            != sizeof hackpid) {
             error("cannot write lock (%s)", fq_lock);
         }
         if (close(fd) == -1) {
@@ -207,13 +212,15 @@ gotlock:
     }
 }
 
-void regularize(s) /* normalize file name - we don't like .'s, /'s, spaces */
+/* normalize file name - we don't like .'s, /'s, spaces */
+void
+regularize(s)
 register char *s;
 {
     register char *lp;
 
-    while ((lp = index(s, '.')) || (lp = index(s, '/'))
-           || (lp = index(s, ' ')))
+    while ((lp = index(s, '.')) != 0 || (lp = index(s, '/')) != 0
+           || (lp = index(s, ' ')) != 0)
         *lp = '_';
 #if defined(SYSV) && !defined(AIX_31) && !defined(SVR4) && !defined(LINUX) \
     && !defined(__APPLE__)
@@ -258,10 +265,13 @@ unsigned msec; /* milliseconds */
 int
 dosh()
 {
-    register char *str;
+    char *str;
+
 #ifdef SYSCF
     if (!sysopt.shellers || !sysopt.shellers[0]
         || !check_user_string(sysopt.shellers)) {
+        /* FIXME: should no longer assume a particular command keystroke,
+           and perhaps ought to say "unavailable" rather than "unknown" */
         Norep("Unknown command '!'.");
         return 0;
     }
@@ -284,6 +294,7 @@ child(wt)
 int wt;
 {
     register int f;
+
     suspend_nhwindows((char *) 0); /* also calls end_screen() */
 #ifdef _M_UNIX
     sco_mapon();
@@ -297,13 +308,13 @@ int wt;
 #ifdef CHDIR
         (void) chdir(getenv("HOME"));
 #endif
-        return (1);
+        return 1;
     }
     if (f == -1) { /* cannot fork */
         pline("Fork failed.  Try again.");
-        return (0);
+        return 0;
     }
-/* fork succeeded; wait for child to exit */
+    /* fork succeeded; wait for child to exit */
 #ifndef NO_SIGNAL
     (void) signal(SIGINT, SIG_IGN);
     (void) signal(SIGQUIT, SIG_IGN);
@@ -325,9 +336,9 @@ int wt;
         wait_synch();
     }
     resume_nhwindows();
-    return (0);
+    return 0;
 }
-#endif
+#endif /* SHELL || DEF_PAGER || DEF_MAILREADER */
 
 #ifdef GETRES_SUPPORT
 
@@ -338,34 +349,37 @@ extern int FDECL(nh_getresgid, (gid_t *, gid_t *, gid_t *));
 extern gid_t NDECL(nh_getgid);
 extern gid_t NDECL(nh_getegid);
 
-int(getresuid)(ruid, euid, suid)
+/* the following several functions assume __STDC__ where parentheses
+   around the name of a function-like macro prevent macro expansion */
+
+int (getresuid)(ruid, euid, suid)
 uid_t *ruid, *euid, *suid;
 {
     return nh_getresuid(ruid, euid, suid);
 }
 
-uid_t(getuid)()
+uid_t (getuid)()
 {
     return nh_getuid();
 }
 
-uid_t(geteuid)()
+uid_t (geteuid)()
 {
     return nh_geteuid();
 }
 
-int(getresgid)(rgid, egid, sgid)
+int (getresgid)(rgid, egid, sgid)
 gid_t *rgid, *egid, *sgid;
 {
     return nh_getresgid(rgid, egid, sgid);
 }
 
-gid_t(getgid)()
+gid_t (getgid)()
 {
     return nh_getgid();
 }
 
-gid_t(getegid)()
+gid_t (getegid)()
 {
     return nh_getegid();
 }
@@ -375,12 +389,15 @@ gid_t(getegid)()
 /* XXX should be ifdef PANICTRACE_GDB, but there's no such symbol yet */
 #ifdef PANICTRACE
 boolean
-file_exists(const char *path)
+file_exists(path)
+const char *path;
 {
+    struct stat sb;
+
     /* Just see if it's there - trying to figure out if we can actually
      * execute it in all cases is too hard - we really just want to
-     * catch typos in SYSCF. */
-    struct stat sb;
+     * catch typos in SYSCF.
+     */
     if (stat(path, &sb)) {
         return FALSE;
     }