--- minit.c	2004-03-24 22:45:00.000000000 +0100
+++ minit-mmuless.c	2004-03-31 11:55:03.000000000 +0200
@@ -140,7 +140,7 @@
 #endif
   if (killed == (pid_t)-1) {
     write(2,"all services exited.\n",21);
-    exit(0);
+    if (i_am_init) exit(0);
   }
   if (killed==0) return;
   i=findbypid(killed);
@@ -172,10 +172,26 @@
   char *s=0;
   int argc;
   char *argv0=0;
+
+  /* prepare command to be called */
+  if (!openreadclose("params",&s,&len)) {
+    argv=split(s,'\n',&argc,2,1);
+    if (argv[argc-1]) argv[argc-1]=0; else argv[argc]=0;
+  } else {
+    argv=(char**)malloc(2*sizeof(char*));
+    argv[1]=0;
+  }
+  argv0=(char*)malloc(PATH_MAX+1);
+  if (!argv || !argv0) goto reterror;
+  if (readlink("run",argv0,PATH_MAX)<0) {
+    if (errno!=EINVAL) goto reterror;	/* not a symbolic link */
+    argv0=strdup("./run");
+  }
+
 again:
-  switch (p=fork()) {
+  switch (p=vfork()) {
   case (pid_t)-1:
-    if (count>3) return 0;
+    if (count>3) goto reterror;
     sleep(++count*2);
     goto again;
   case 0:
@@ -195,19 +211,6 @@
       req.tv_nsec=500000000;
       nanosleep(&req,0);
     }
-    if (!openreadclose("params",&s,&len)) {
-      argv=split(s,'\n',&argc,2,1);
-      if (argv[argc-1]) argv[argc-1]=0; else argv[argc]=0;
-    } else {
-      argv=(char**)malloc(2*sizeof(char*));
-      argv[1]=0;
-    }
-    argv0=(char*)malloc(PATH_MAX+1);
-    if (!argv || !argv0) _exit(1);
-    if (readlink("run",argv0,PATH_MAX)<0) {
-      if (errno!=EINVAL) _exit(1);	/* not a symbolic link */
-      argv0=strdup("./run");
-    }
 /*    chdir("/"); */
     argv[0]=strrchr(argv0,'/');
     if (argv[0])
@@ -231,6 +234,9 @@
     execve(argv0,argv,environ);
     _exit(1);	
   default:
+    /* free the command memory */
+    if (s) free(s);
+    if (argv) free(argv);
     fd=open("sync",O_RDONLY);
     if (fd>=0) {
       pid_t p2;
@@ -240,6 +246,10 @@
     }
     return p;
   }
+reterror:
+  if (s) free(s);
+  if (argv) free(argv);
+  return 0;
 }
 
 /* start a service, return nonzero on error */
