1 /* 2 * Copyright (c) 2018 FUJITSU LIMITED. All rights reserved. 3 * Author: yang xu <xuyang.jy (at) cn.fujitsu.com> 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, see <http://www.gnu.org/licenses/>. 17 */ 18 19 #ifndef COMPAT_TST_16_H__ 20 #define COMPAT_TST_16_H__ 21 22 #include <errno.h> 23 #include <grp.h> 24 #if defined(__GLIBC__) || defined(__ANDROID__) 25 #include <sys/fsuid.h> 26 #endif 27 #include <sys/types.h> 28 #include <unistd.h> 29 30 #include "compat_gid.h" 31 #include "compat_uid.h" 32 #include "lapi/syscalls.h" 33 34 int setresuid(uid_t ruid, uid_t euid, uid_t suid); 35 int setresgid(gid_t rgid, gid_t egid, gid_t sgid); 36 37 38 /* If the platform has __NR_sys_name32 defined it 39 * means that __NR_sys_name is a 16-bit version of 40 * sys_name() syscall 41 */ 42 #ifdef TST_USE_COMPAT16_SYSCALL 43 # define TST_CREATE_SYSCALL(sys_name, ...) ({ \ 44 if (__NR_##sys_name##32 != __LTP__NR_INVALID_SYSCALL) { \ 45 return tst_syscall(__NR_##sys_name, ##__VA_ARGS__); \ 46 } else { \ 47 tst_brk(TCONF, \ 48 "16-bit version of %s() is not supported on your " \ 49 "platform", #sys_name); \ 50 return -1; \ 51 } \ 52 }) 53 #else 54 # define TST_CREATE_SYSCALL(sys_name, ...) ({\ 55 return sys_name(__VA_ARGS__); \ 56 }) 57 #endif 58 59 #define UID16_CHECK(uid, sys_name) ({ \ 60 if (!UID_SIZE_CHECK(uid)) { \ 61 tst_brk(TBROK, \ 62 "uid %d of %s is too large for testing 16-bit " \ 63 "version of %s()", uid, #uid, #sys_name); \ 64 } \ 65 }) 66 #define GID16_CHECK(gid, sys_name) ({ \ 67 if (!GID_SIZE_CHECK(gid)) { \ 68 tst_brk(TBROK, \ 69 "gid %d of %s is too large for testing 16-bit " \ 70 "version of %s()", gid, #gid, #sys_name); \ 71 } \ 72 }) 73 74 int SETGROUPS(size_t gidsetsize, GID_T *list) 75 { 76 TST_CREATE_SYSCALL(setgroups, gidsetsize, list); 77 } 78 79 int GETGROUPS(size_t gidsetsize, GID_T *list) 80 { 81 TST_CREATE_SYSCALL(getgroups, gidsetsize, list); 82 } 83 84 int SETUID(UID_T uid) 85 { 86 TST_CREATE_SYSCALL(setuid, uid); 87 } 88 89 UID_T GETUID(void) 90 { 91 TST_CREATE_SYSCALL(getuid); 92 } 93 94 int SETGID(GID_T gid) 95 { 96 TST_CREATE_SYSCALL(setgid, gid); 97 } 98 99 GID_T GETGID(void) 100 { 101 TST_CREATE_SYSCALL(getgid); 102 } 103 104 UID_T GETEUID(void) 105 { 106 TST_CREATE_SYSCALL(geteuid); 107 } 108 109 GID_T GETEGID(void) 110 { 111 TST_CREATE_SYSCALL(getegid); 112 } 113 114 int SETFSUID(UID_T uid) 115 { 116 TST_CREATE_SYSCALL(setfsuid, uid); 117 } 118 119 int SETFSGID(GID_T gid) 120 { 121 TST_CREATE_SYSCALL(setfsgid, gid); 122 } 123 124 int SETREUID(UID_T ruid, UID_T euid) 125 { 126 TST_CREATE_SYSCALL(setreuid, ruid, euid); 127 } 128 int SETREGID(GID_T rgid, GID_T egid) 129 { 130 TST_CREATE_SYSCALL(setregid, rgid, egid); 131 } 132 133 int SETRESUID(UID_T ruid, UID_T euid, UID_T suid) 134 { 135 TST_CREATE_SYSCALL(setresuid, ruid, euid, suid); 136 } 137 138 int SETRESGID(GID_T rgid, GID_T egid, GID_T sgid) 139 { 140 TST_CREATE_SYSCALL(setresgid, rgid, egid, sgid); 141 } 142 143 int FCHOWN(unsigned int fd, UID_T owner, GID_T group) 144 { 145 TST_CREATE_SYSCALL(fchown, fd, owner, group); 146 } 147 148 int LCHOWN(const char *path, UID_T owner, GID_T group) 149 { 150 TST_CREATE_SYSCALL(lchown, path, owner, group); 151 } 152 153 int CHOWN(const char *path, UID_T owner, GID_T group) 154 { 155 TST_CREATE_SYSCALL(chown, path, owner, group); 156 } 157 #endif /* COMPAT_TST_16_H__ */ 158