*/
#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