1ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh/*
2ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * Copyright (c) Red Hat Inc., 2008
3ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved.
4ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh *
5ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * This program is free software;  you can redistribute it and/or modify
6ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * it under the terms of the GNU General Public License as published by
7ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * the Free Software Foundation; either version 2 of the License, or
8ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * (at your option) any later version.
9ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh *
10ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * This program is distributed in the hope that it will be useful,
11ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * but WITHOUT ANY WARRANTY;  without even the implied warranty of
12ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
13ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * the GNU General Public License for more details.
14ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh *
15ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * You should have received a copy of the GNU General Public License
16ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * along with this program;  if not, write to the Free Software
17ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh */
19ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh
20ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh/* Author: Masatake YAMATO <yamato@redhat.com> */
21ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh
22ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh#ifndef __LTP_COMPAT_16_H__
23ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh#define __LTP_COMPAT_16_H__
24ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh
25ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh#include <errno.h>
261c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh#include <grp.h>
27df61090ed94fd47e8a1b1e1c0cdd0de2708c9842Steven Jackson#if defined(__GLIBC__) || defined(__ANDROID__)
280e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh#include <sys/fsuid.h>
290e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh#endif
301c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh#include <sys/types.h>
311c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh#include <unistd.h>
321c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh
33ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh#include "compat_gid.h"
341c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh#include "compat_uid.h"
35ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh#include "linux_syscall_numbers.h"
36ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh
370a45153c159d7182a681db67a04cb948748611e1Stanislav Kholmanskikhint setresuid(uid_t ruid, uid_t euid, uid_t suid);
380a45153c159d7182a681db67a04cb948748611e1Stanislav Kholmanskikhint setresgid(gid_t rgid, gid_t egid, gid_t sgid);
390a45153c159d7182a681db67a04cb948748611e1Stanislav Kholmanskikh
400a45153c159d7182a681db67a04cb948748611e1Stanislav Kholmanskikh
41ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh/* If the platform has __NR_sys_name32 defined it
42ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * means that __NR_sys_name is a 16-bit version of
43ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * sys_name() syscall
44ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh */
45ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh#ifdef TST_USE_COMPAT16_SYSCALL
46ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh# define LTP_CREATE_SYSCALL(sys_name, cleanup, ...) \
47ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh	if (__NR_##sys_name##32 != __LTP__NR_INVALID_SYSCALL) { \
48ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh		return ltp_syscall(__NR_##sys_name, ##__VA_ARGS__); \
49ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh	} else { \
50ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh		tst_brkm(TCONF, cleanup, \
51ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh			"16-bit version of %s() is not supported on your " \
52ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh			"platform", #sys_name); \
53ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh	}
54ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh#else
55ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh# define LTP_CREATE_SYSCALL(sys_name, cleanup, ...) \
569592ed451d67ec4d70fc9892db5c3dcb1b2d60beCyril Hrubis	(void) cleanup;                             \
57ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh	return sys_name(__VA_ARGS__)
58ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh#endif
59ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh
601c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh#define UID16_CHECK(uid, sys_name, cleanup) \
611c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikhif (!UID_SIZE_CHECK(uid)) { \
621c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh	tst_brkm(TBROK, cleanup, \
631c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh		"uid %d of %s is too large for testing 16-bit version " \
641c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh		"of %s()", uid, #uid, #sys_name); \
651c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh}
661c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh
671c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh#define GID16_CHECK(gid, sys_name, cleanup) \
681c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikhif (!GID_SIZE_CHECK(gid)) { \
691c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh	tst_brkm(TBROK, cleanup, \
701c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh		"gid %d of %s is too large for testing 16-bit version " \
711c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh		"of %s()", gid, #gid, #sys_name); \
721c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh}
731c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh
741c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh
75ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikhint SETGROUPS(void (cleanup)(void), size_t gidsetsize, GID_T *list)
76ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh{
77ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh	LTP_CREATE_SYSCALL(setgroups, cleanup, gidsetsize, list);
78ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh}
79ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh
80ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikhint GETGROUPS(void (cleanup)(void), size_t gidsetsize, GID_T *list)
81ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh{
82ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh	LTP_CREATE_SYSCALL(getgroups, cleanup, gidsetsize, list);
83ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh}
84ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh
851c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikhint SETUID(void (cleanup)(void), UID_T uid)
861c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh{
871c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh	LTP_CREATE_SYSCALL(setuid, cleanup, uid);
881c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh}
891c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh
901c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav KholmanskikhUID_T GETUID(void (cleanup)(void))
911c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh{
921c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh	LTP_CREATE_SYSCALL(getuid, cleanup);
931c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh}
941c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh
951c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikhint SETGID(void (cleanup)(void), GID_T gid)
961c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh{
971c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh	LTP_CREATE_SYSCALL(setgid, cleanup, gid);
981c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh}
991c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh
1001c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav KholmanskikhGID_T GETGID(void (cleanup)(void))
1011c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh{
1021c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh	LTP_CREATE_SYSCALL(getgid, cleanup);
1031c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh}
1044940d00b75ec0f7a375dce5542afd56cfc0267f0Stanislav Kholmanskikh
1054940d00b75ec0f7a375dce5542afd56cfc0267f0Stanislav KholmanskikhUID_T GETEUID(void (cleanup)(void))
1064940d00b75ec0f7a375dce5542afd56cfc0267f0Stanislav Kholmanskikh{
1074940d00b75ec0f7a375dce5542afd56cfc0267f0Stanislav Kholmanskikh	LTP_CREATE_SYSCALL(geteuid, cleanup);
1084940d00b75ec0f7a375dce5542afd56cfc0267f0Stanislav Kholmanskikh}
1094940d00b75ec0f7a375dce5542afd56cfc0267f0Stanislav Kholmanskikh
1104940d00b75ec0f7a375dce5542afd56cfc0267f0Stanislav KholmanskikhGID_T GETEGID(void (cleanup)(void))
1114940d00b75ec0f7a375dce5542afd56cfc0267f0Stanislav Kholmanskikh{
1124940d00b75ec0f7a375dce5542afd56cfc0267f0Stanislav Kholmanskikh	LTP_CREATE_SYSCALL(getegid, cleanup);
1134940d00b75ec0f7a375dce5542afd56cfc0267f0Stanislav Kholmanskikh}
1140e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh
1150e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikhint SETFSUID(void (cleanup)(void), UID_T uid)
1160e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh{
1170e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh	LTP_CREATE_SYSCALL(setfsuid, cleanup, uid);
1180e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh}
1190e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh
1200e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikhint SETFSGID(void (cleanup)(void), GID_T gid)
1210e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh{
1220e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh	LTP_CREATE_SYSCALL(setfsgid, cleanup, gid);
1230e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh}
124e0f8585542dc0cab1a31c8d6a3e0c92b5206bef4Stanislav Kholmanskikh
125e0f8585542dc0cab1a31c8d6a3e0c92b5206bef4Stanislav Kholmanskikhint SETREUID(void (cleanup)(void), UID_T ruid, UID_T euid)
126e0f8585542dc0cab1a31c8d6a3e0c92b5206bef4Stanislav Kholmanskikh{
127e0f8585542dc0cab1a31c8d6a3e0c92b5206bef4Stanislav Kholmanskikh	LTP_CREATE_SYSCALL(setreuid, cleanup, ruid, euid);
128e0f8585542dc0cab1a31c8d6a3e0c92b5206bef4Stanislav Kholmanskikh}
129de8b8db9324b78e62f79b4c7eca7dc1ed570425cStanislav Kholmanskikhint SETREGID(void (cleanup)(void), GID_T rgid, GID_T egid)
130de8b8db9324b78e62f79b4c7eca7dc1ed570425cStanislav Kholmanskikh{
131de8b8db9324b78e62f79b4c7eca7dc1ed570425cStanislav Kholmanskikh	LTP_CREATE_SYSCALL(setregid, cleanup, rgid, egid);
132de8b8db9324b78e62f79b4c7eca7dc1ed570425cStanislav Kholmanskikh}
133a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikh
13475fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtianint SETRESUID(void (cleanup)(void), UID_T ruid, UID_T euid, UID_T suid)
13575fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian{
13675fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian	LTP_CREATE_SYSCALL(setresuid, cleanup, ruid, euid, suid);
13775fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian}
13875fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian
13975fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtianint SETRESGID(void (cleanup)(void), GID_T rgid, GID_T egid, GID_T sgid)
14075fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian{
14175fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian	LTP_CREATE_SYSCALL(setresgid, cleanup, rgid, egid, sgid);
14275fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian}
14375fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian
14475fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtianint FCHOWN(void (cleanup)(void), unsigned int fd, UID_T owner, GID_T group)
14575fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian{
14675fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian	LTP_CREATE_SYSCALL(fchown, cleanup, fd, owner, group);
14775fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian}
14875fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian
149a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikhint LCHOWN(void (cleanup)(void), const char *path, UID_T owner, GID_T group)
150a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikh{
151a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikh	LTP_CREATE_SYSCALL(lchown, cleanup, path, owner, group);
152a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikh}
15375fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian
15475fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtianint CHOWN(void (cleanup)(void), const char *path, UID_T owner, GID_T group)
15575fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian{
15675fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian	LTP_CREATE_SYSCALL(chown, cleanup, path, owner, group);
15775fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian}
158ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh#endif /* __LTP_COMPAT_16_H__ */
159