1 /* SCCS Id: @(#)unixres.c 3.4 2001/07/08 */
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");
35 return f(ruid, euid, suid);
39 real_getresgid(rgid, egid, sgid)
40 gid_t *rgid, *egid, *sgid;
42 int (*f)(gid_t *, gid_t *, gid_t *); /* getresgid signature */
44 f = dlsym(RTLD_NEXT, "getresgid");
47 return f(rgid, egid, sgid);
51 # if defined(BSD) || defined(SVR4)
56 real_getresuid(ruid, euid, suid)
57 uid_t *ruid, *euid, *suid;
59 return syscall(SYS_getresuid, ruid, euid, suid);
62 # else /* SYS_getresuid */
69 real_getresuid(ruid, euid, suid)
70 uid_t *ruid, *euid, *suid;
77 retval = fstat(pfd[0], &st);
82 *ruid = syscall(SYS_getuid);
83 *suid = *ruid; /* Not supported under SVR4 */
88 # endif /* SYS_getresuid */
93 real_getresgid(rgid, egid, sgid)
94 gid_t *rgid, *egid, *sgid;
96 return syscall(SYS_getresgid, rgid, egid, sgid);
99 # else /* SYS_getresgid */
102 real_getresgid(rgid, egid, sgid)
103 gid_t *rgid, *egid, *sgid;
110 retval = fstat(pfd[0], &st);
115 *rgid = syscall(SYS_getgid);
116 *sgid = *rgid; /* Not supported under SVR4 */
121 # endif /* SYS_getresgid */
122 # endif /* BSD || SVR4 */
125 static unsigned int hiding_privileges = 0;
128 * Note: returns the value _after_ action.
132 hide_privileges(flag)
137 else if (hiding_privileges)
139 return hiding_privileges;
143 nh_getresuid(ruid, euid, suid)
144 uid_t *ruid, *euid, *suid;
146 int retval = real_getresuid(ruid, euid, suid);
147 if (!retval && hiding_privileges)
148 *euid = *suid = *ruid;
155 uid_t ruid, euid, suid;
156 (void) real_getresuid(&ruid, &euid, &suid);
163 uid_t ruid, euid, suid;
164 (void) real_getresuid(&ruid, &euid, &suid);
165 if (hiding_privileges)
171 nh_getresgid(rgid, egid, sgid)
172 gid_t *rgid, *egid, *sgid;
174 int retval = real_getresgid(rgid, egid, sgid);
175 if (!retval && hiding_privileges)
176 *egid = *sgid = *rgid;
183 gid_t rgid, egid, sgid;
184 (void) real_getresgid(&rgid, &egid, &sgid);
191 gid_t rgid, egid, sgid;
192 (void) real_getresgid(&rgid, &egid, &sgid);
193 if (hiding_privileges)
198 #else /* GETRES_SUPPORT */
200 # ifdef GNOME_GRAPHICS
202 hide_privileges(flag)
209 #endif /* GETRES_SUPPORT */