[TinyLogin] _syscall2() macro .vs. USE_SYSTEM_PWD_GRP=false (Patch included)
Durabone
durabone at earthlink.net
Wed Nov 7 08:44:08 PST 2007
All;
My issue is resolved.
I don't know if its useful, but I made a patch last night to
setgroups.c which removes the _syscall2() macro usage,
and replaces it with un-macro-ed pieces. Needs more
testing, but I hope it's useful.
Note that it builds now against 2.6.20, using kernel headers
made with "make kernel_headers." It was tested on ARM.
db
--- tinylogin-1.4/pwd_grp/setgroups.c 2002-06-22 20:09:17.000000000
-0700
+++ tinylogin-1.4Patched/pwd_grp/setgroups.c 2007-11-07
08:35:02.000000000 -0800
@@ -29,6 +29,42 @@
#include <asm/unistd.h>
#include "group.h"
-//#define __NR_setgroups 81
-_syscall2(int, setgroups, size_t, size, const gid_t *, list);
+#define MAX_ERRNO 4095
+
+#define __sys2(x) #x
+#define __sys1(x) __sys2(x)
+
+#if defined(__thumb__) || defined(__ARM_EABI__)
+ #define __SYS_REG(name) register long __sysreg __asm__("r7") =
__NR_##name;
+ #define __SYS_REG_LIST(regs...) "r" (__sysreg) , ##regs
+ #define __syscall(name) "swi\t0"
+#else
+ #define __SYS_REG(name)
+ #define __SYS_REG_LIST(regs...) regs
+ #define __syscall(name) "swi\t" __sys1(__NR_##name) ""
+#endif
+
+int
+setgroups( size_t size, const gid_t * list )
+{
+ __SYS_REG(name)
+ register long __r0 __asm__("r0") = (long)size;
+ register long __r1 __asm__("r1") = (long)list;
+ register long __res_r0 __asm__("r0");
+ long __res;
+ __asm__ __volatile__ (
+ __syscall(setgroups)
+ : "=r" (__res_r0)
+ : __SYS_REG_LIST( "0" (__r0), "r" (__r1) )
+ : "memory" );
+ __res = __res_r0;
+
+ do {
+ if ((unsigned long)(__res) >= (unsigned long)(-MAX_ERRNO)) {
+ errno = -(__res);
+ __res = -1;
+ }
+ return (int) (__res);
+ } while(0);
+}
More information about the tinylogin
mailing list