From: PatR Date: Wed, 13 Sep 2017 22:33:43 +0000 (-0700) Subject: sys/unix/*.c formatting and PANICTRACE fix X-Git-Tag: NetHack-3.6.1_RC01~366 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cd8f0283529f6d66b01547f821cc67ff78d971e2;p=nethack sys/unix/*.c formatting and PANICTRACE fix 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....) --- diff --git a/doc/fixes36.1 b/doc/fixes36.1 index 01b5df772..a481a914b 100644 --- a/doc/fixes36.1 +++ b/doc/fixes36.1 @@ -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 diff --git a/include/decl.h b/include/decl.h index b289b83cb..d26b75dd0 100644 --- a/include/decl.h +++ b/include/decl.h @@ -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 diff --git a/src/decl.c b/src/decl.c index 479c075aa..77ed16bbf 100644 --- a/src/decl.c +++ b/src/decl.c @@ -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 */ diff --git a/sys/unix/unixmain.c b/sys/unix/unixmain.c index c10691444..2270ab262 100644 --- a/sys/unix/unixmain.c +++ b/sys/unix/unixmain.c @@ -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) diff --git a/sys/unix/unixres.c b/sys/unix/unixres.c index c60df7669..cd0954a1f 100644 --- a/sys/unix/unixres.c +++ b/sys/unix/unixres.c @@ -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; diff --git a/sys/unix/unixunix.c b/sys/unix/unixunix.c index d02d70c63..9c4f312b3 100644 --- a/sys/unix/unixunix.c +++ b/sys/unix/unixunix.c @@ -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 */ /* 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; }