1 /* aNetHack 0.0.1 unixres.c $ANH-Date: 1432512788 2015/05/25 00:13:08 $ $ANH-Branch: master $:$ANH-Revision: 1.12 $ */
2 /* Copyright (c) Slash'EM development team, 2001. */
3 /* aNetHack 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
;
79 retval
= fstat(pfd
[0], &st
);
84 *ruid
= syscall(SYS_getuid
);
85 *suid
= *ruid
; /* Not supported under SVR4 */
90 #endif /* SYS_getresuid */
95 real_getresgid(rgid
, egid
, sgid
)
96 gid_t
*rgid
, *egid
, *sgid
;
98 return syscall(SYS_getresgid
, rgid
, egid
, sgid
);
101 #else /* SYS_getresgid */
104 real_getresgid(rgid
, egid
, sgid
)
105 gid_t
*rgid
, *egid
, *sgid
;
112 retval
= fstat(pfd
[0], &st
);
117 *rgid
= syscall(SYS_getgid
);
118 *sgid
= *rgid
; /* Not supported under SVR4 */
123 #endif /* SYS_getresgid */
124 #endif /* BSD || SVR4 */
127 static unsigned int hiding_privileges
= 0;
130 * Note: returns the value _after_ action.
134 hide_privileges(flag
)
139 else if (hiding_privileges
)
141 return hiding_privileges
;
145 nh_getresuid(ruid
, euid
, suid
)
146 uid_t
*ruid
, *euid
, *suid
;
148 int retval
= real_getresuid(ruid
, euid
, suid
);
149 if (!retval
&& hiding_privileges
)
150 *euid
= *suid
= *ruid
;
157 uid_t ruid
, euid
, suid
;
158 (void) real_getresuid(&ruid
, &euid
, &suid
);
165 uid_t ruid
, euid
, suid
;
166 (void) real_getresuid(&ruid
, &euid
, &suid
);
167 if (hiding_privileges
)
173 nh_getresgid(rgid
, egid
, sgid
)
174 gid_t
*rgid
, *egid
, *sgid
;
176 int retval
= real_getresgid(rgid
, egid
, sgid
);
177 if (!retval
&& hiding_privileges
)
178 *egid
= *sgid
= *rgid
;
185 gid_t rgid
, egid
, sgid
;
186 (void) real_getresgid(&rgid
, &egid
, &sgid
);
193 gid_t rgid
, egid
, sgid
;
194 (void) real_getresgid(&rgid
, &egid
, &sgid
);
195 if (hiding_privileges
)
200 #else /* GETRES_SUPPORT */
202 #ifdef GNOME_GRAPHICS
204 hide_privileges(flag
)
211 #endif /* GETRES_SUPPORT */