diff options
author | Markos Chandras <markos.chandras@imgtec.com> | 2012-10-11 11:01:37 +0100 |
---|---|---|
committer | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2013-02-20 13:45:12 +0100 |
commit | 11372c665a2db1ec81fb6128fe535c39bcca7b6c (patch) | |
tree | 2464823b6c17cf79fd587e4b7b826a29c69c9b43 /libc/sysdeps | |
parent | 58570fc8e1fd601f15be5758ab95013d56771804 (diff) |
fork: Use clone if arch does not have the fork syscall
Signed-off-by: Markos Chandras <markos.chandras@imgtec.com>
Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Diffstat (limited to 'libc/sysdeps')
-rw-r--r-- | libc/sysdeps/linux/common/fork.c | 24 | ||||
-rw-r--r-- | libc/sysdeps/linux/common/stubs.c | 2 |
2 files changed, 23 insertions, 3 deletions
diff --git a/libc/sysdeps/linux/common/fork.c b/libc/sysdeps/linux/common/fork.c index fa1f4affa..b5715c7a0 100644 --- a/libc/sysdeps/linux/common/fork.c +++ b/libc/sysdeps/linux/common/fork.c @@ -9,14 +9,34 @@ #include <sys/syscall.h> -#if defined __NR_fork && defined __ARCH_USE_MMU__ +#if defined __ARCH_USE_MMU__ # include <unistd.h> -# include <cancel.h> +extern __typeof(fork) __libc_fork; +# if defined __NR_fork +# include <cancel.h> +# define __NR___libc_fork __NR_fork _syscall0(pid_t, fork) + +# elif defined __NR_clone && !defined __NR_fork +# include <sys/types.h> +# include <signal.h> +# include <stddef.h> +pid_t fork(void) +{ + pid_t pid = INLINE_SYSCALL(clone, 4, SIGCHLD, NULL, NULL, NULL); + + if (pid < 0) + return -1; + + return pid; +} + +# endif # ifdef __UCLIBC_HAS_THREADS__ strong_alias(fork,__libc_fork) libc_hidden_weak(fork) # else libc_hidden_def(fork) # endif + #endif diff --git a/libc/sysdeps/linux/common/stubs.c b/libc/sysdeps/linux/common/stubs.c index 845c9bb01..419557c6a 100644 --- a/libc/sysdeps/linux/common/stubs.c +++ b/libc/sysdeps/linux/common/stubs.c @@ -128,7 +128,7 @@ make_stub(fgetxattr) make_stub(flistxattr) #endif -#ifndef __NR_fork +#if !defined __NR_fork && !defined __NR_clone make_stub(fork) #endif |