OSDN Git Service

Probe for fork() instead of relying on a distro-specific #define.
authorRob Landley <rob@landley.net>
Fri, 3 Jul 2015 20:17:25 +0000 (15:17 -0500)
committerRob Landley <rob@landley.net>
Fri, 3 Jul 2015 20:17:25 +0000 (15:17 -0500)
lib/portability.c
scripts/genconfig.sh

index 4da49dd..78e500b 100644 (file)
@@ -6,7 +6,20 @@
 
 #include "toys.h"
 
-#if !defined(__uClinux__)
+// We can't fork() on nommu systems, and vfork() requires an exec() or exit()
+// before resuming the parent (because they share a heap until then). And no,
+// we can't implement our own clone() call that does the equivalent of fork()
+// because nommu heaps use physical addresses so if we copy the heap all our
+// pointers are wrong. (You need an mmu in order to map two heaps to the same
+// address range without interfering with each other.) In the absence of
+// a portable way to tell malloc() to start a new heap without freeing the old
+// one, you pretty much need the exec().)
+
+// So we exec ourselves (via /proc/self/exe, if anybody knows a way to
+// re-exec self without depending on the filesystem, I'm all ears),
+// and use the arguments to signal reentry.
+
+#if CFG_TOYBOX_FORK
 pid_t xfork(void)
 {
   pid_t pid = fork();
index 313c7c7..031e97e 100755 (executable)
@@ -83,6 +83,12 @@ EOF
     #error nope
     #endif
 EOF
+
+  # nommu support
+  probesymbol TOYBOX_FORK << EOF
+    #include <unistd.h>
+    int main(int argc, char *argv[]) { return fork(); }
+EOF
 }
 
 genconfig()