소스 검색

Add in missing capset and capget syscalls. Stub out syscalls when missing
rather then just omitting them...
-Erik

Eric Andersen 23 년 전
부모
커밋
2735ede06c
1개의 변경된 파일98개의 추가작업 그리고 46개의 파일을 삭제
  1. 98 46
      libc/sysdeps/linux/common/syscalls.c

+ 98 - 46
libc/sysdeps/linux/common/syscalls.c

@@ -38,9 +38,15 @@ _syscall1(void, _exit, int, status);
 
 //#define __NR_fork             2
 #ifdef L_fork
+#include <unistd.h>
 #	ifdef __UCLIBC_HAS_MMU__
-#		include <unistd.h>
 		_syscall0(pid_t, fork);
+#	else
+		pid_t fork(void)
+		{
+			__set_errno(ENOSYS);
+			return -1;
+		}
 #	endif
 #endif
 
@@ -292,7 +298,6 @@ _syscall1(int, rmdir, const char *, pathname);
 
 //#define __NR_dup              41
 #ifdef L_dup
-
 #include <unistd.h>
 _syscall1(int, dup, int, oldfd);
 #endif
@@ -329,37 +334,43 @@ _syscall0(gid_t, getgid);
 
 //#define __NR_geteuid          49
 #ifdef	L_geteuid
-#ifdef	__NR_geteuid
-#include <unistd.h>
-_syscall0(uid_t, geteuid);
-#else
-uid_t geteuid(void)
-{
-	return (getuid());
-}
-#endif
+#	ifdef	__NR_geteuid
+#	include <unistd.h>
+	_syscall0(uid_t, geteuid);
+#	else
+	uid_t geteuid(void)
+	{
+		return (getuid());
+	}
+#	endif
 #endif
 
 //#define __NR_getegid          50
 #ifdef	L_getegid
-#ifdef	__NR_getegid
-#include <unistd.h>
-_syscall0(gid_t, getegid);
-#else
-gid_t getegid(void)
-{
-	return (getgid());
-}
-#endif
+#	ifdef	__NR_getegid
+#	include <unistd.h>
+	_syscall0(gid_t, getegid);
+#	else
+	gid_t getegid(void)
+	{
+		return (getgid());
+	}
+#	endif
 #endif
 
 //#define __NR_acct             51
 
-#ifdef __NR_umount2 /* Old kernels don't have umount2 */ 
 //#define __NR_umount2          52
-#	ifdef L_umount2
+#ifdef L_umount2
+#	ifdef __NR_umount2 /* Old kernels don't have umount2 */ 
 #		include <sys/mount.h>
 		_syscall2(int, umount2, const char *, special_file, int, flags);
+#	else
+		int umount2(const char * special_file, int flags)
+		{
+			__set_errno(ENOSYS);
+			return -1;
+		}
 #	endif
 #endif
 
@@ -370,7 +381,6 @@ gid_t getegid(void)
 #include <stdarg.h>
 #include <sys/ioctl.h>
 #define __NR__ioctl __NR_ioctl
-
 extern int _ioctl(int fd, int request, void *arg);
 
 _syscall3(int, _ioctl, int, fd, int, request, void *, arg);
@@ -386,7 +396,6 @@ int ioctl(int fd, unsigned long int request, ...)
 	va_end(list);
 	return _ioctl(fd, request, arg);
 }
-
 #endif
 
 //#define __NR_fcntl            55
@@ -394,7 +403,6 @@ int ioctl(int fd, unsigned long int request, ...)
 #include <stdarg.h>
 #include <fcntl.h>
 #define __NR__fcntl __NR_fcntl
-
 extern int _fcntl(int fd, int cmd, long arg);
 
 _syscall3(int, _fcntl, int, fd, int, cmd, long, arg);
@@ -446,15 +454,15 @@ _syscall2(int, dup2, int, oldfd, int, newfd);
 
 //#define __NR_getppid          64
 #ifdef	L_getppid
-#include <unistd.h>
-#ifdef	__NR_getppid
-_syscall0(pid_t, getppid);
-#else
-pid_t getppid(void)
-{
-	return (getpid());
-}
-#endif
+#	include <unistd.h>
+#	ifdef	__NR_getppid
+	_syscall0(pid_t, getppid);
+#	else
+	pid_t getppid(void)
+	{
+		return (getpid());
+	}
+#	endif
 #endif
 
 //#define __NR_getpgrp          65
@@ -588,7 +596,6 @@ _syscall2(int, swapon, const char *, path, int, swapflags);
 //#define __NR_reboot           88
 #ifdef L__reboot
 #define __NR__reboot __NR_reboot
-
 extern int _reboot(int magic, int magic2, int flag);
 
 _syscall3(int, _reboot, int, magic, int, magic2, int, flag);
@@ -606,7 +613,6 @@ int reboot(int flag)
 #define __NR__mmap __NR_mmap
 #include <unistd.h>
 #include <sys/mman.h>
-
 extern __ptr_t _mmap(unsigned long *buffer);
 
 _syscall1(__ptr_t, _mmap, unsigned long *, buffer);
@@ -683,11 +689,17 @@ _syscall2(int, statfs, const char *, path, struct statfs *, buf);
 _syscall2(int, fstatfs, int, fd, struct statfs *, buf);
 #endif
 
-#ifdef __UCLIBC_HAS_MMU__
 //#define __NR_ioperm           101
-#	ifdef L_ioperm
-#		include <sys/io.h>
+#ifdef L_ioperm
+#include <sys/io.h>
+#	if defined __UCLIBC_HAS_MMU__ && defined __NR_ioperm
 		_syscall3(int, ioperm, unsigned long, from, unsigned long, num, int, turn_on);
+#	else
+		int ioperm(unsigned long from, unsigned long num, int turn_on)
+		{
+			__set_errno(ENOSYS);
+			return -1;
+		}
 #	endif
 #endif
 
@@ -700,7 +712,6 @@ _syscall2(int, socketcall, int, call, unsigned long *, args);
 #ifdef L__syslog
 #include <unistd.h>
 #define __NR__syslog		__NR_syslog
-
 extern int _syslog(int type, char *buf, int len);
 
 _syscall3(int, _syslog, int, type, char *, buf, int, len);
@@ -802,12 +813,18 @@ int fstat(int filedes, struct libc_stat *buf)
 
 //#define __NR_olduname         109
 
-#if defined __UCLIBC_HAS_MMU__ && defined __NR_iopl
 //#define __NR_iopl             110
 #ifdef L_iopl
 #include <sys/io.h>
-_syscall1(int, iopl, int, level);
-#endif
+#	if defined __UCLIBC_HAS_MMU__ && defined __NR_iopl
+		_syscall1(int, iopl, int, level);
+#	else
+		int iopl(int level)
+		{
+			__set_errno(ENOSYS);
+			return -1;
+		}
+#	endif
 #endif
 
 //#define __NR_vhangup          111
@@ -906,6 +923,12 @@ _syscall5(int, init_module, void *, first, void *, second, void *, third,
 #ifdef L_delete_module
 #	ifdef __NR_delete_module
 		_syscall1(int, delete_module, const char *, name);
+#	else
+		int delete_module(const char * name)
+		{
+			__set_errno(ENOSYS);
+			return -1;
+		}
 #	endif
 #endif
 
@@ -1048,8 +1071,15 @@ _syscall4(__ptr_t, mremap, __ptr_t, old_address, size_t, old_size, size_t,
 //#define __NR_query_module             167
 #ifdef L_query_module
 #	ifdef __NR_query_module
-	_syscall5(int, query_module, const char *, name, int, which,
-			void *, buf, size_t, bufsize, size_t*, ret);
+		_syscall5(int, query_module, const char *, name, int, which,
+				void *, buf, size_t, bufsize, size_t*, ret);
+#	else
+		int query_module(const char * name, int which,
+					void * buf, size_t bufsize, size_t* ret)
+		{
+			__set_errno(ENOSYS);
+			return -1;
+		}
 #	endif	
 #endif	
 
@@ -1079,11 +1109,33 @@ _syscall3(int, chown, const char *, path, uid_t, owner, gid_t, group);
 #endif
 
 //#define __NR_getcwd                   183
-// See unistd/getcwd.c -- we don't use the syscall, even when it is available...
+// See unistd/getcwd.c -- we don't use this syscall, even when it is available...
 
 //#define __NR_capget                   184
+#ifdef L_capget
+#	ifdef __NR_capget
+		_syscall2(int, capget, void*, header, void*, data);
+#	else
+		int capget(void* header, void* data)
+		{
+			__set_errno(ENOSYS);
+			return -1;
+		}
+#	endif
+#endif
 
 //#define __NR_capset                   185
+#ifdef L_capset
+#	ifdef __NR_capset
+		_syscall2(int, capset, void*, header, const void*, data);
+#	else
+		int capset(void* header, const void* data)
+		{
+			__set_errno(ENOSYS);
+			return -1;
+		}
+#	endif
+#endif
 
 //#define __NR_sigaltstack              186