--- ../slashem-0.0.6E4F3/include/unixconf.h	Wed Feb 28 23:02:57 2001
+++ ./include/unixconf.h	Thu Mar  8 13:51:01 2001
@@ -383,6 +383,20 @@
 # define __HC__ hc
 # undef hc
 #endif
+
+#if defined(GTK_GRAPHICS) || defined(GNOME_GRAPHICS)
+#if defined(LINUX)
+# include <linux/unistd.h>
+# if defined(__NR_getresuid) && defined(__NR_getresgid)	/* ie., >= v2.1.44 */
+#  define GETRES_SUPPORT
+# endif
+#elif defined(BSD)
+# include <sys/syscall.h>
+# if defined(SYS_getresuid) && defined(SYS_getresgid)   /* eg., Free BSD */
+#  define GETRES_SUPPORT
+# endif
+#endif	/* LINUX || BSD */
+#endif	/* GTK_GRAPHICS || GNOME_GRAPHICS */
 
 #endif /* UNIXCONF_H */
 #endif /* UNIX */
--- ../slashem-0.0.6E4F3/sys/unix/unixunix.c	Wed Feb 28 23:02:49 2001
+++ ./sys/unix/unixunix.c	Thu Mar  8 14:02:41 2001
@@ -706,3 +706,38 @@
 /* ----------  END FILE LOCKING HANDLING ----------- */
 
 #endif	/* FILE_AREAS */
+
+#ifdef GETRES_SUPPORT
+
+int
+(getresuid)(ruid, euid, suid)
+uid_t *ruid, *euid, *suid;
+{
+    return nh_getresuid(ruid, euid, suid);
+}
+
+uid_t
+(getuid)()
+{
+    return nh_getuid();
+}
+
+uid_t
+(geteuid)()
+{
+    return nh_geteuid();
+}
+
+gid_t
+(getgid)()
+{
+    return nh_getgid();
+}
+
+gid_t
+(getegid)()
+{
+    return nh_getegid();
+}
+
+#endif	/* GETRES_SUPPORT */
--- ../slashem-0.0.6E4F3/sys/unix/unixres.c	Thu Jan  1 01:00:00 1970
+++ ./sys/unix/unixres.c	Thu Mar  8 14:03:15 2001
@@ -0,0 +1,126 @@
+/* $Id: unixres.c,v $ */
+/* Copyright (c) Slash'EM development team, 2001. */
+/* NetHack may be freely redistributed.  See license for details. */
+
+/* [ALI] This module defines nh_xxx functions to replace getuid etc which
+ * will hide privileges from the caller if so desired.
+ *
+ * Currently supported UNIX variants:
+ *	Linux version 2.1.44 and above
+ *	FreeBSD (versions unknown)
+ *
+ * Note: SunOS and Solaris have no mechanism for retrieving the saved id,
+ * so temporarily dropping privileges on these systems is sufficient to
+ * hide them.
+ */
+
+#include "unixconf.h"
+
+#ifdef GETRES_SUPPORT
+
+#if defined(LINUX)
+
+static _syscall3(int, getresuid, uid_t *, ruid, uid_t *, euid, uid_t *, suid)
+static _syscall3(int, getresgid, gid_t *, rgid, gid_t *, egid, gid_t *, sgid)
+
+static int
+real_getresuid(ruid, euid, suid)
+uid_t *ruid, *euid, *suid;
+{
+    return getresuid(ruid, euid, suid);
+}
+
+static int
+real_getresgid(rgid, egid, sgid)
+gid_t *rgid, *egid, *sgid;
+{
+    return getresgid(rgid, egid, sgid);
+}
+
+#elif defined(BSD)
+
+static int
+real_getresuid(ruid, euid, suid)
+uid_t *ruid, *euid, *suid;
+{
+    return syscall(SYS_getresuid, ruid, euid, suid);
+}
+
+static int
+real_getresgid(rgid, egid, sgid)
+gid_t *rgid, *egid, *sgid;
+{
+    return syscall(SYS_getresgid, rgid, egid, sgid);
+}
+
+#endif /* LINUX || BSD */
+
+static unsigned int hiding_privileges = 0;
+
+/*
+ * Note: returns the value _after_ action.
+ */
+
+int
+hide_privileges(flag)
+int flag;
+{
+    if (flag)
+	hiding_privileges++;
+    else if (hiding_privileges)
+	hiding_privileges--;
+    return hiding_privileges;
+}
+
+int
+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;
+}
+
+uid_t
+nh_getuid()
+{
+    uid_t ruid, euid, suid;
+    (void) real_getresuid(&ruid, &euid, &suid);
+    return ruid;
+}
+
+uid_t
+nh_geteuid()
+{
+    uid_t ruid, euid, suid;
+    (void) real_getresuid(&ruid, &euid, &suid);
+    return hiding_privileges ? ruid : euid;
+}
+
+gid_t
+nh_getgid()
+{
+    gid_t rgid, egid, sgid;
+    (void) real_getresgid(&rgid, &egid, &sgid);
+    return rgid;
+}
+
+gid_t
+nh_getegid()
+{
+    gid_t rgid, egid, sgid;
+    (void) real_getresgid(&rgid, &egid, &sgid);
+    return hiding_privileges ? rgid : egid;
+}
+
+#else	/* GETRES_SUPPORT */
+
+int
+hide_privileges(flag)
+int flag;
+{
+    return 0;
+}
+
+#endif	/* GETRES_SUPPORT */

