1 /* NetHack 3.6 unixres.c $NHDT-Date: 1432512788 2015/05/25 00:13:08 $ $NHDT-Branch: master $:$NHDT-Revision: 1.12 $ */
2 /* Copyright (c) Slash'EM development team, 2001. */
3 /* NetHack may be freely redistributed. See license for details. */
5 /* [ALI] This module defines nh_xxx functions to replace getuid etc which
6 * will hide privileges from the caller if so desired.
8 * Currently supported UNIX variants:
9 * Linux version 2.1.44 and above
10 * FreeBSD (versions unknown)
12 * Note: SunOS and Solaris have no mechanism for retrieving the saved id,
13 * so temporarily dropping privileges on these systems is sufficient to
23 /* requires dynamic linking with libc */
27 real_getresuid(ruid, euid, suid)
28 uid_t *ruid, *euid, *suid;
30 int (*f)(uid_t *, uid_t *, uid_t *); /* getresuid signature */
32 f = dlsym(RTLD_NEXT, "getresuid");
36 return (*f)(ruid, euid, suid);
40 real_getresgid(rgid, egid, sgid)
41 gid_t *rgid, *egid, *sgid;
43 int (*f)(gid_t *, gid_t *, gid_t *); /* getresgid signature */
45 f = dlsym(RTLD_NEXT, "getresgid");
49 return (*f)(rgid, egid, sgid);
53 #if defined(BSD) || defined(SVR4)
58 real_getresuid(ruid, euid, suid)
59 uid_t *ruid, *euid, *suid;
61 return syscall(SYS_getresuid, ruid, euid, suid);
64 #else /* SYS_getresuid */
71 real_getresuid(ruid, euid, suid)
72 uid_t *ruid, *euid, *suid;
80 retval = fstat(pfd[0], &st);
85 *ruid = syscall(SYS_getuid);
86 *suid = *ruid; /* Not supported under SVR4 */
91 #endif /* SYS_getresuid */
96 real_getresgid(rgid, egid, sgid)
97 gid_t *rgid, *egid, *sgid;
99 return syscall(SYS_getresgid, rgid, egid, sgid);
102 #else /* SYS_getresgid */
105 real_getresgid(rgid, egid, sgid)
106 gid_t *rgid, *egid, *sgid;
114 retval = fstat(pfd[0], &st);
119 *rgid = syscall(SYS_getgid);
120 *sgid = *rgid; /* Not supported under SVR4 */
125 #endif /* SYS_getresgid */
126 #endif /* BSD || SVR4 */
129 static unsigned int hiding_privileges = 0;
132 * Note: returns the value _after_ action.
136 hide_privileges(flag)
141 else if (hiding_privileges)
143 return hiding_privileges;
147 nh_getresuid(ruid, euid, suid)
148 uid_t *ruid, *euid, *suid;
150 int retval = real_getresuid(ruid, euid, suid);
152 if (!retval && hiding_privileges)
153 *euid = *suid = *ruid;
160 uid_t ruid, euid, suid;
162 (void) real_getresuid(&ruid, &euid, &suid);
169 uid_t ruid, euid, suid;
171 (void) real_getresuid(&ruid, &euid, &suid);
172 if (hiding_privileges)
178 nh_getresgid(rgid, egid, sgid)
179 gid_t *rgid, *egid, *sgid;
181 int retval = real_getresgid(rgid, egid, sgid);
183 if (!retval && hiding_privileges)
184 *egid = *sgid = *rgid;
191 gid_t rgid, egid, sgid;
193 (void) real_getresgid(&rgid, &egid, &sgid);
200 gid_t rgid, egid, sgid;
202 (void) real_getresgid(&rgid, &egid, &sgid);
203 if (hiding_privileges)
208 #else /* GETRES_SUPPORT */
210 #ifdef GNOME_GRAPHICS
212 hide_privileges(flag)
219 #endif /* GETRES_SUPPORT */