[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