Commit 19b84f3c35d7c8e9d4743cdeb93534f7640001e1
1 parent
08fc6089
added setgroups and getgroups syscalls
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@131 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
28 additions
and
2 deletions
linux-user/syscall.c
@@ -58,6 +58,7 @@ | @@ -58,6 +58,7 @@ | ||
58 | #include <linux/hdreg.h> | 58 | #include <linux/hdreg.h> |
59 | #include <linux/soundcard.h> | 59 | #include <linux/soundcard.h> |
60 | #include <linux/dirent.h> | 60 | #include <linux/dirent.h> |
61 | +#include <linux/kd.h> | ||
61 | 62 | ||
62 | #include "qemu.h" | 63 | #include "qemu.h" |
63 | 64 | ||
@@ -117,6 +118,7 @@ extern int setresuid(uid_t, uid_t, uid_t); | @@ -117,6 +118,7 @@ extern int setresuid(uid_t, uid_t, uid_t); | ||
117 | extern int getresuid(uid_t *, uid_t *, uid_t *); | 118 | extern int getresuid(uid_t *, uid_t *, uid_t *); |
118 | extern int setresgid(gid_t, gid_t, gid_t); | 119 | extern int setresgid(gid_t, gid_t, gid_t); |
119 | extern int getresgid(gid_t *, gid_t *, gid_t *); | 120 | extern int getresgid(gid_t *, gid_t *, gid_t *); |
121 | +extern int setgroups(int, gid_t *); | ||
120 | 122 | ||
121 | static inline long get_errno(long ret) | 123 | static inline long get_errno(long ret) |
122 | { | 124 | { |
@@ -1722,9 +1724,33 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -1722,9 +1724,33 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
1722 | } | 1724 | } |
1723 | break; | 1725 | break; |
1724 | case TARGET_NR_getgroups: | 1726 | case TARGET_NR_getgroups: |
1725 | - goto unimplemented; | 1727 | + { |
1728 | + int gidsetsize = arg1; | ||
1729 | + uint16_t *target_grouplist = (void *)arg2; | ||
1730 | + gid_t *grouplist; | ||
1731 | + int i; | ||
1732 | + | ||
1733 | + grouplist = alloca(gidsetsize * sizeof(gid_t)); | ||
1734 | + ret = get_errno(getgroups(gidsetsize, grouplist)); | ||
1735 | + if (!is_error(ret)) { | ||
1736 | + for(i = 0;i < gidsetsize; i++) | ||
1737 | + target_grouplist[i] = tswap16(grouplist[i]); | ||
1738 | + } | ||
1739 | + } | ||
1740 | + break; | ||
1726 | case TARGET_NR_setgroups: | 1741 | case TARGET_NR_setgroups: |
1727 | - goto unimplemented; | 1742 | + { |
1743 | + int gidsetsize = arg1; | ||
1744 | + uint16_t *target_grouplist = (void *)arg2; | ||
1745 | + gid_t *grouplist; | ||
1746 | + int i; | ||
1747 | + | ||
1748 | + grouplist = alloca(gidsetsize * sizeof(gid_t)); | ||
1749 | + for(i = 0;i < gidsetsize; i++) | ||
1750 | + grouplist[i] = tswap16(target_grouplist[i]); | ||
1751 | + ret = get_errno(setgroups(gidsetsize, grouplist)); | ||
1752 | + } | ||
1753 | + break; | ||
1728 | case TARGET_NR_select: | 1754 | case TARGET_NR_select: |
1729 | goto unimplemented; | 1755 | goto unimplemented; |
1730 | case TARGET_NR_symlink: | 1756 | case TARGET_NR_symlink: |