NHDT->ANH, nethack->anethack, nhdat->anhdat
[aNetHack.git] / sys / unix / unixres.c
blobb4d750b58776a848cc52b1a3955fd27f526ad510
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
14 * hide them.
17 #include "config.h"
19 #ifdef GETRES_SUPPORT
21 #if defined(LINUX)
23 /* requires dynamic linking with libc */
24 #include <dlfcn.h>
26 static int
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");
33 if (!f)
34 return -1;
36 return f(ruid, euid, suid);
39 static int
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");
46 if (!f)
47 return -1;
49 return f(rgid, egid, sgid);
52 #else
53 #if defined(BSD) || defined(SVR4)
55 #ifdef SYS_getresuid
57 static int
58 real_getresuid(ruid, euid, suid)
59 uid_t *ruid, *euid, *suid;
61 return syscall(SYS_getresuid, ruid, euid, suid);
64 #else /* SYS_getresuid */
66 #ifdef SVR4
67 #include <sys/stat.h>
68 #endif /* SVR4 */
70 static int
71 real_getresuid(ruid, euid, suid)
72 uid_t *ruid, *euid, *suid;
74 int retval;
75 int pfd[2];
76 struct stat st;
77 if (pipe(pfd))
78 return -1;
79 retval = fstat(pfd[0], &st);
80 close(pfd[0]);
81 close(pfd[1]);
82 if (!retval) {
83 *euid = st.st_uid;
84 *ruid = syscall(SYS_getuid);
85 *suid = *ruid; /* Not supported under SVR4 */
87 return retval;
90 #endif /* SYS_getresuid */
92 #ifdef SYS_getresgid
94 static int
95 real_getresgid(rgid, egid, sgid)
96 gid_t *rgid, *egid, *sgid;
98 return syscall(SYS_getresgid, rgid, egid, sgid);
101 #else /* SYS_getresgid */
103 static int
104 real_getresgid(rgid, egid, sgid)
105 gid_t *rgid, *egid, *sgid;
107 int retval;
108 int pfd[2];
109 struct stat st;
110 if (pipe(pfd))
111 return -1;
112 retval = fstat(pfd[0], &st);
113 close(pfd[0]);
114 close(pfd[1]);
115 if (!retval) {
116 *egid = st.st_gid;
117 *rgid = syscall(SYS_getgid);
118 *sgid = *rgid; /* Not supported under SVR4 */
120 return retval;
123 #endif /* SYS_getresgid */
124 #endif /* BSD || SVR4 */
125 #endif /* LINUX */
127 static unsigned int hiding_privileges = 0;
130 * Note: returns the value _after_ action.
134 hide_privileges(flag)
135 boolean flag;
137 if (flag)
138 hiding_privileges++;
139 else if (hiding_privileges)
140 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;
151 return retval;
154 uid_t
155 nh_getuid()
157 uid_t ruid, euid, suid;
158 (void) real_getresuid(&ruid, &euid, &suid);
159 return ruid;
162 uid_t
163 nh_geteuid()
165 uid_t ruid, euid, suid;
166 (void) real_getresuid(&ruid, &euid, &suid);
167 if (hiding_privileges)
168 euid = ruid;
169 return euid;
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;
179 return retval;
182 gid_t
183 nh_getgid()
185 gid_t rgid, egid, sgid;
186 (void) real_getresgid(&rgid, &egid, &sgid);
187 return rgid;
190 gid_t
191 nh_getegid()
193 gid_t rgid, egid, sgid;
194 (void) real_getresgid(&rgid, &egid, &sgid);
195 if (hiding_privileges)
196 egid = rgid;
197 return egid;
200 #else /* GETRES_SUPPORT */
202 #ifdef GNOME_GRAPHICS
204 hide_privileges(flag)
205 boolean flag;
207 return 0;
209 #endif
211 #endif /* GETRES_SUPPORT */