aboutsummaryrefslogtreecommitdiff
path: root/bsd-user/bsd-proc.h
diff options
context:
space:
mode:
authorStacey Son <sson@FreeBSD.org>2023-09-25 21:24:08 +0300
committerWarner Losh <imp@bsdimp.com>2023-10-03 17:14:06 -0600
commita478416dc89f9eaceb8d6550efd8417a965153a2 (patch)
tree3c6eae28a315c7da4072719050487b4b475a48f3 /bsd-user/bsd-proc.h
parentb623031ca60b23dbb8a573306495e7d99821a9af (diff)
downloadqemu-a478416dc89f9eaceb8d6550efd8417a965153a2.zip
qemu-a478416dc89f9eaceb8d6550efd8417a965153a2.tar.gz
qemu-a478416dc89f9eaceb8d6550efd8417a965153a2.tar.bz2
bsd-user: Implement getgroups(2) and setgroups(2) system calls.
Signed-off-by: Stacey Son <sson@FreeBSD.org> Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com> Reviewed-by: Warner Losh <imp@bsdimp.com> Message-Id: <20230925182425.3163-12-kariem.taha2.7@gmail.com>
Diffstat (limited to 'bsd-user/bsd-proc.h')
-rw-r--r--bsd-user/bsd-proc.h44
1 files changed, 44 insertions, 0 deletions
diff --git a/bsd-user/bsd-proc.h b/bsd-user/bsd-proc.h
index b6225e5..7b25aa1 100644
--- a/bsd-user/bsd-proc.h
+++ b/bsd-user/bsd-proc.h
@@ -41,4 +41,48 @@ static inline abi_long do_bsd_exit(void *cpu_env, abi_long arg1)
return 0;
}
+/* getgroups(2) */
+static inline abi_long do_bsd_getgroups(abi_long gidsetsize, abi_long arg2)
+{
+ abi_long ret;
+ uint32_t *target_grouplist;
+ g_autofree gid_t *grouplist;
+ int i;
+
+ grouplist = g_try_new(gid_t, gidsetsize);
+ ret = get_errno(getgroups(gidsetsize, grouplist));
+ if (gidsetsize != 0) {
+ if (!is_error(ret)) {
+ target_grouplist = lock_user(VERIFY_WRITE, arg2, gidsetsize * 2, 0);
+ if (!target_grouplist) {
+ return -TARGET_EFAULT;
+ }
+ for (i = 0; i < ret; i++) {
+ target_grouplist[i] = tswap32(grouplist[i]);
+ }
+ unlock_user(target_grouplist, arg2, gidsetsize * 2);
+ }
+ }
+ return ret;
+}
+
+/* setgroups(2) */
+static inline abi_long do_bsd_setgroups(abi_long gidsetsize, abi_long arg2)
+{
+ uint32_t *target_grouplist;
+ g_autofree gid_t *grouplist;
+ int i;
+
+ grouplist = g_try_new(gid_t, gidsetsize);
+ target_grouplist = lock_user(VERIFY_READ, arg2, gidsetsize * 2, 1);
+ if (!target_grouplist) {
+ return -TARGET_EFAULT;
+ }
+ for (i = 0; i < gidsetsize; i++) {
+ grouplist[i] = tswap32(target_grouplist[i]);
+ }
+ unlock_user(target_grouplist, arg2, 0);
+ return get_errno(setgroups(gidsetsize, grouplist));
+}
+
#endif /* !BSD_PROC_H_ */