1 /* 2 * Copyright (c) Red Hat Inc., 2008 3 * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved. 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 13 * the GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 18 */ 19 20 /* Author: Masatake YAMATO <yamato (at) redhat.com> */ 21 22 #ifndef __LTP_COMPAT_16_H__ 23 #define __LTP_COMPAT_16_H__ 24 25 #include <errno.h> 26 #include <grp.h> 27 #if defined(__GLIBC__) || defined(__ANDROID__) 28 #include <sys/fsuid.h> 29 #endif 30 #include <sys/types.h> 31 #include <unistd.h> 32 33 #include "compat_gid.h" 34 #include "compat_uid.h" 35 #include "lapi/syscalls.h" 36 37 int setresuid(uid_t ruid, uid_t euid, uid_t suid); 38 int setresgid(gid_t rgid, gid_t egid, gid_t sgid); 39 40 41 /* If the platform has __NR_sys_name32 defined it 42 * means that __NR_sys_name is a 16-bit version of 43 * sys_name() syscall 44 */ 45 #ifdef TST_USE_COMPAT16_SYSCALL 46 # define LTP_CREATE_SYSCALL(sys_name, cleanup, ...) \ 47 if (__NR_##sys_name##32 != __LTP__NR_INVALID_SYSCALL) { \ 48 return ltp_syscall(__NR_##sys_name, ##__VA_ARGS__); \ 49 } else { \ 50 tst_brkm(TCONF, cleanup, \ 51 "16-bit version of %s() is not supported on your " \ 52 "platform", #sys_name); \ 53 } 54 #else 55 # define LTP_CREATE_SYSCALL(sys_name, cleanup, ...) \ 56 (void) cleanup; \ 57 return sys_name(__VA_ARGS__) 58 #endif 59 60 #define UID16_CHECK(uid, sys_name, cleanup) \ 61 if (!UID_SIZE_CHECK(uid)) { \ 62 tst_brkm(TBROK, cleanup, \ 63 "uid %d of %s is too large for testing 16-bit version " \ 64 "of %s()", uid, #uid, #sys_name); \ 65 } 66 67 #define GID16_CHECK(gid, sys_name, cleanup) \ 68 if (!GID_SIZE_CHECK(gid)) { \ 69 tst_brkm(TBROK, cleanup, \ 70 "gid %d of %s is too large for testing 16-bit version " \ 71 "of %s()", gid, #gid, #sys_name); \ 72 } 73 74 75 int SETGROUPS(void (cleanup)(void), size_t gidsetsize, GID_T *list) 76 { 77 LTP_CREATE_SYSCALL(setgroups, cleanup, gidsetsize, list); 78 } 79 80 int GETGROUPS(void (cleanup)(void), size_t gidsetsize, GID_T *list) 81 { 82 LTP_CREATE_SYSCALL(getgroups, cleanup, gidsetsize, list); 83 } 84 85 int SETUID(void (cleanup)(void), UID_T uid) 86 { 87 LTP_CREATE_SYSCALL(setuid, cleanup, uid); 88 } 89 90 UID_T GETUID(void (cleanup)(void)) 91 { 92 LTP_CREATE_SYSCALL(getuid, cleanup); 93 } 94 95 int SETGID(void (cleanup)(void), GID_T gid) 96 { 97 LTP_CREATE_SYSCALL(setgid, cleanup, gid); 98 } 99 100 GID_T GETGID(void (cleanup)(void)) 101 { 102 LTP_CREATE_SYSCALL(getgid, cleanup); 103 } 104 105 UID_T GETEUID(void (cleanup)(void)) 106 { 107 LTP_CREATE_SYSCALL(geteuid, cleanup); 108 } 109 110 GID_T GETEGID(void (cleanup)(void)) 111 { 112 LTP_CREATE_SYSCALL(getegid, cleanup); 113 } 114 115 int SETFSUID(void (cleanup)(void), UID_T uid) 116 { 117 LTP_CREATE_SYSCALL(setfsuid, cleanup, uid); 118 } 119 120 int SETFSGID(void (cleanup)(void), GID_T gid) 121 { 122 LTP_CREATE_SYSCALL(setfsgid, cleanup, gid); 123 } 124 125 int SETREUID(void (cleanup)(void), UID_T ruid, UID_T euid) 126 { 127 LTP_CREATE_SYSCALL(setreuid, cleanup, ruid, euid); 128 } 129 int SETREGID(void (cleanup)(void), GID_T rgid, GID_T egid) 130 { 131 LTP_CREATE_SYSCALL(setregid, cleanup, rgid, egid); 132 } 133 134 int SETRESUID(void (cleanup)(void), UID_T ruid, UID_T euid, UID_T suid) 135 { 136 LTP_CREATE_SYSCALL(setresuid, cleanup, ruid, euid, suid); 137 } 138 139 int SETRESGID(void (cleanup)(void), GID_T rgid, GID_T egid, GID_T sgid) 140 { 141 LTP_CREATE_SYSCALL(setresgid, cleanup, rgid, egid, sgid); 142 } 143 144 int FCHOWN(void (cleanup)(void), unsigned int fd, UID_T owner, GID_T group) 145 { 146 LTP_CREATE_SYSCALL(fchown, cleanup, fd, owner, group); 147 } 148 149 int LCHOWN(void (cleanup)(void), const char *path, UID_T owner, GID_T group) 150 { 151 LTP_CREATE_SYSCALL(lchown, cleanup, path, owner, group); 152 } 153 154 int CHOWN(void (cleanup)(void), const char *path, UID_T owner, GID_T group) 155 { 156 LTP_CREATE_SYSCALL(chown, cleanup, path, owner, group); 157 } 158 #endif /* __LTP_COMPAT_16_H__ */ 159