]> rtime.felk.cvut.cz Git - l4.git/blobdiff - l4/pkg/uclibc/lib/contrib/uclibc/libc/sysdeps/linux/common/fork.c
update
[l4.git] / l4 / pkg / uclibc / lib / contrib / uclibc / libc / sysdeps / linux / common / fork.c
index f21ec35b818d72a477032d89a677223cdfb0ab3d..b5715c7a0cc32ec124733cb9aac7866f4a64ca05 100644 (file)
@@ -8,28 +8,35 @@
  */
 
 #include <sys/syscall.h>
-#include <unistd.h>
 
-#ifdef __ARCH_USE_MMU__
-
-#ifdef __NR_fork
-#define __NR___libc_fork __NR_fork
+#if defined __ARCH_USE_MMU__
+# include <unistd.h>
 extern __typeof(fork) __libc_fork;
-_syscall0(pid_t, __libc_fork)
-weak_alias(__libc_fork,fork)
-libc_hidden_weak(fork)
-#endif
-
-#elif defined __UCLIBC_HAS_STUBS__
+# if defined __NR_fork
+#  include <cancel.h>
+#  define __NR___libc_fork __NR_fork
+_syscall0(pid_t, fork)
 
-extern __typeof(fork) __libc_fork;
-pid_t __libc_fork(void)
+# elif defined __NR_clone  && !defined __NR_fork
+#  include <sys/types.h>
+#  include <signal.h>
+#  include <stddef.h>
+pid_t fork(void)
 {
-       __set_errno(ENOSYS);
-       return -1;
+       pid_t pid = INLINE_SYSCALL(clone, 4, SIGCHLD, NULL, NULL, NULL);
+
+       if (pid < 0)
+               return -1;
+
+       return pid;
 }
-weak_alias(__libc_fork,fork)
+
+# endif
+# ifdef __UCLIBC_HAS_THREADS__
+strong_alias(fork,__libc_fork)
 libc_hidden_weak(fork)
-link_warning(fork, "fork: this function is not implemented on no-mmu systems")
+# else
+libc_hidden_def(fork)
+# endif
 
 #endif