From 19b84f3c35d7c8e9d4743cdeb93534f7640001e1 Mon Sep 17 00:00:00 2001 From: bellard Date: Thu, 8 May 2003 15:41:49 +0000 Subject: [PATCH] added setgroups and getgroups syscalls git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@131 c046a42c-6fe2-441c-8c8c-71466251a162 --- linux-user/syscall.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 7561ed1..3f6084d 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -58,6 +58,7 @@ #include #include #include +#include #include "qemu.h" @@ -117,6 +118,7 @@ extern int setresuid(uid_t, uid_t, uid_t); extern int getresuid(uid_t *, uid_t *, uid_t *); extern int setresgid(gid_t, gid_t, gid_t); extern int getresgid(gid_t *, gid_t *, gid_t *); +extern int setgroups(int, gid_t *); static inline long get_errno(long ret) { @@ -1722,9 +1724,33 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, } break; case TARGET_NR_getgroups: - goto unimplemented; + { + int gidsetsize = arg1; + uint16_t *target_grouplist = (void *)arg2; + gid_t *grouplist; + int i; + + grouplist = alloca(gidsetsize * sizeof(gid_t)); + ret = get_errno(getgroups(gidsetsize, grouplist)); + if (!is_error(ret)) { + for(i = 0;i < gidsetsize; i++) + target_grouplist[i] = tswap16(grouplist[i]); + } + } + break; case TARGET_NR_setgroups: - goto unimplemented; + { + int gidsetsize = arg1; + uint16_t *target_grouplist = (void *)arg2; + gid_t *grouplist; + int i; + + grouplist = alloca(gidsetsize * sizeof(gid_t)); + for(i = 0;i < gidsetsize; i++) + grouplist[i] = tswap16(target_grouplist[i]); + ret = get_errno(setgroups(gidsetsize, grouplist)); + } + break; case TARGET_NR_select: goto unimplemented; case TARGET_NR_symlink: -- 2.7.4