Loading...
--- Libc/Libc-1044.1.2/sys/fork.c
+++ Libc/Libc-997.90.3/sys/fork.c
@@ -25,20 +25,24 @@
 #include <errno.h>
 #include <TargetConditionals.h>
 
-#include "libc_private.h"
-
+#if TARGET_IPHONE_SIMULATOR
+extern pid_t (*_host_fork)(void);
+#else
 extern pid_t __fork(void);
+#endif
 
 static void (*_libSystem_atfork_prepare)(void) = 0;
 static void (*_libSystem_atfork_parent)(void) = 0;
 static void (*_libSystem_atfork_child)(void) = 0;
 
+#if !TARGET_IPHONE_SIMULATOR
 __private_extern__
-void _libc_fork_init(const struct _libc_functions *funcs)
+#endif
+void _libc_fork_init(void (*prepare)(void), void (*parent)(void), void (*child)(void))
 {
-	_libSystem_atfork_prepare = funcs->atfork_prepare;
-	_libSystem_atfork_parent = funcs->atfork_parent;
-	_libSystem_atfork_child = funcs->atfork_child;
+	_libSystem_atfork_prepare = prepare;
+	_libSystem_atfork_parent = parent;
+	_libSystem_atfork_child = child;
 }
 
 /*
@@ -53,7 +57,12 @@
 	// Reader beware: this __fork() call is yet another wrapper around the actual syscall
 	// and lives inside libsyscall. The fork syscall needs some cuddling by asm before it's
 	// allowed to see the big wide C world.
+#if TARGET_IPHONE_SIMULATOR
+	// _host_fork is yet another layer of wrapping that lives in the simulator's libSystem
+	ret = _host_fork();
+#else
 	ret = __fork();
+#endif
 	if (-1 == ret)
 	{
 		// __fork already set errno for us