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
E struct plinemsg_type *plinemsg_types;
#ifdef PANICTRACE
-E char *ARGV0;
+E const char *ARGV0;
#endif
#undef E
struct plinemsg_type *plinemsg_types = (struct plinemsg_type *) 0;
#ifdef PANICTRACE
-char *ARGV0;
+const char *ARGV0;
#endif
/* support for lint.h */
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
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
#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
* 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,
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);
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);
}
wd_message();
}
+ /* moveloop() never returns but isn't flagged NORETURN */
moveloop(resuming);
+
exit(EXIT_SUCCESS);
/*NOTREACHED*/
- return (0);
+ return 0;
}
static void
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':
(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);
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];
authorize_wizard_mode()
{
struct passwd *pw = get_unix_pw();
+
if (pw && sysopt.wizards && sysopt.wizards[0]) {
if (check_user_string(sysopt.wizards))
return TRUE;
int pwlen;
char *eop, *w;
char *pwname;
+
if (optstr[0] == '*')
return TRUE; /* allow any user */
if (!pw)
if (!f)
return -1;
- return f(ruid, euid, suid);
+ return (*f)(ruid, euid, suid);
}
static int
if (!f)
return -1;
- return f(rgid, egid, sgid);
+ return (*f)(rgid, egid, sgid);
}
#else
int retval;
int pfd[2];
struct stat st;
+
if (pipe(pfd))
return -1;
retval = fstat(pfd[0], &st);
int retval;
int pfd[2];
struct stat st;
+
if (pipe(pfd))
return -1;
retval = fstat(pfd[0], &st);
uid_t *ruid, *euid, *suid;
{
int retval = real_getresuid(ruid, euid, suid);
+
if (!retval && hiding_privileges)
*euid = *suid = *ruid;
return retval;
nh_getuid()
{
uid_t ruid, euid, suid;
+
(void) real_getresuid(&ruid, &euid, &suid);
return ruid;
}
nh_geteuid()
{
uid_t ruid, euid, suid;
+
(void) real_getresuid(&ruid, &euid, &suid);
if (hiding_privileges)
euid = ruid;
gid_t *rgid, *egid, *sgid;
{
int retval = real_getresgid(rgid, egid, sgid);
+
if (!retval && hiding_privileges)
*egid = *sgid = *rgid;
return retval;
nh_getgid()
{
gid_t rgid, egid, sgid;
+
(void) real_getresgid(&rgid, &egid, &sgid);
return rgid;
}
nh_getegid()
{
gid_t rgid, egid, sgid;
+
(void) real_getresgid(&rgid, &egid, &sgid);
if (hiding_privileges)
egid = rgid;
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;
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));
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. */
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
}
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
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);
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;
; /* 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.");
}
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) {
}
}
-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__)
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;
}
int wt;
{
register int f;
+
suspend_nhwindows((char *) 0); /* also calls end_screen() */
#ifdef _M_UNIX
sco_mapon();
#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);
wait_synch();
}
resume_nhwindows();
- return (0);
+ return 0;
}
-#endif
+#endif /* SHELL || DEF_PAGER || DEF_MAILREADER */
#ifdef GETRES_SUPPORT
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();
}
/* 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;
}