| 1234567891011121314151617181920212223242526272829303132333435363738394041 | /* * Copyright (C) 2004 Atmel Corporation * * This file is subject to the terms and conditions of the GNU Lesser General * Public License.  See the file "COPYING.LIB" in the main directory of this * archive for more details. */#include <errno.h>#include <sys/syscall.h>#include <unistd.h>/* * I don't know if we can be absolutely certain that the fn and arg * parameters are preserved when returning as the child. If the * compiler stores them in registers (r0-r7), they should be. */int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg){       register int (*_fn)(void *arg) = fn;       register void *_arg = arg;       int err;       /* Sanity check the arguments */       err = -EINVAL;       if (!fn)               goto syscall_error;       if (!child_stack)               goto syscall_error;       err = INLINE_SYSCALL(clone, 2, flags, child_stack);       if (err < 0)               goto syscall_error;       else if (err != 0)               return err;       _exit(_fn(_arg));syscall_error:       __set_errno (-err);       return -1;}
 |