Index: branches/eam_branches/ipp-20130207/Ohana/src/libkapa/src/KapaOpen.c
===================================================================
--- branches/eam_branches/ipp-20130207/Ohana/src/libkapa/src/KapaOpen.c	(revision 35138)
+++ branches/eam_branches/ipp-20130207/Ohana/src/libkapa/src/KapaOpen.c	(revision 35139)
@@ -8,4 +8,7 @@
 static int Nvalid = 0;
 static int *VALID = NULL;
+
+char *_parse_nextword (char *string);
+int KapaLaunchCommand (char *line);
 
 int KapaServerInit (KapaSockAddress *Address) {
@@ -225,16 +228,13 @@
 
   if (kapa_name == NULL) {
-    sprintf (line, "%s &", kapa_exec);
+    sprintf (line, "%s", kapa_exec);
   } else {
-    sprintf (line, "%s -name '%s' &", kapa_exec, kapa_name);
-  }
-  int status = system (line);
-  if (status == -1) {
+    sprintf (line, "%s -name '%s'", kapa_exec, kapa_name);
+  }
+
+  int pid = KapaLaunchCommand (line);
+  if (!pid) {
     fprintf (stderr, "failed to launch kapa\n");
-    return 0;
-  }
-  if (status > 0) {
-    fprintf (stderr, "error launching kapa\n");
-    return 0;
+    return (-1);
   }
 
@@ -246,4 +246,16 @@
     // if (errno != EAGAIN) break;
     if (errno != ECONNREFUSED) break;
+    // no connection yet. try again, but first check 
+    // if the kapa job has exited
+    int waitstatus;
+    int result = waitpid (pid, &waitstatus, WNOHANG);
+    if (result == -1) {
+      fprintf (stderr, "problem checking for kapa\n");
+      return (-1);
+    }
+    if (result > 0) {
+      fprintf (stderr, "kapa exited\n");
+      return (-1);
+    }
     usleep (10000);
     Ntry ++;
@@ -282,7 +294,9 @@
     sprintf (temp, "%s -socket %s -name %s &", kapa_exec, socket_name, name);
   }
-  if (system (temp) == -1) {
+
+  int pid = KapaLaunchCommand (temp);
+  if (!pid) {
     fprintf (stderr, "failed to launch kapa\n");
-    return 0;
+    return (-1);
   }
 
@@ -296,4 +310,16 @@
     if (fd != -1) break;
     if (errno != EAGAIN) break;
+    // no connection yet. try again, but first check 
+    // if the kapa job has exited
+    int waitstatus;
+    int result = waitpid (pid, &waitstatus, WNOHANG);
+    if (result == -1) {
+      fprintf (stderr, "problem checking for kapa\n");
+      return (-1);
+    }
+    if (result > 0) {
+      fprintf (stderr, "kapa exited\n");
+      return (-1);
+    }
     usleep (10000);
     Ntry ++;
@@ -327,2 +353,53 @@
   return (sock);
 }
+
+int KapaLaunchCommand (char *line) {
+
+  // use fork & exec to launch the command; return the PID for testing exit
+  int i, done, Nalloc, Nargv;
+  char **argv, *p, *q;
+
+  i = 0;
+  Nalloc = 10;
+  ALLOCATE (argv, char *, Nalloc);
+
+  // split out line into unique words
+  p = line;
+  done = FALSE;
+  while (!done) {
+    q = _parse_nextword (p);
+    if (q && *q) {
+      argv[i] = strncreate (p, q - p);
+      stripwhite (argv[i]);
+      p = q;
+    } else {
+      argv[i] = strcreate (p);
+      stripwhite (argv[i]);
+      done = TRUE;
+    }
+    i++;
+    if (i == Nalloc - 1) {
+      // need to keep one extra for the NULL pointer
+      Nalloc += 10;
+      REALLOCATE (argv, char *, Nalloc);
+    }
+  }
+  Nargv = i;
+  argv[Nargv] = NULL;
+
+  int pid = fork ();
+  if (!pid) { /* must be child process */
+    execvp (argv[0], argv); 
+    return (0);
+  }
+  for (i = 0; i < Nargv; i++) {
+    if (argv[i]) free (argv[i]);
+  }
+  free (argv);
+
+  if (pid == -1) {
+    return (0);
+  }
+
+  return (pid);
+}
