--- ../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 +# if defined(__NR_getresuid) && defined(__NR_getresgid) /* ie., >= v2.1.44 */ +# define GETRES_SUPPORT +# endif +#elif defined(BSD) +# include +# 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 */