Index: trunk/Ohana/src/opihi/pcontrol/StartJob.c
===================================================================
--- trunk/Ohana/src/opihi/pcontrol/StartJob.c	(revision 11388)
+++ trunk/Ohana/src/opihi/pcontrol/StartJob.c	(revision 17475)
@@ -1,11 +1,9 @@
 # include "pcontrol.h"
 
+// job and host are bound together (why pass in both?)
 int StartJob (Job *job, Host *host) {
 
   int  i, Nline, status;
-  char *line, *p;
-  IOBuffer buffer;
-
-  InitIOBuffer (&buffer, 0x100);
+  char *line;
 
   /* job must have assigned host */
@@ -28,5 +26,5 @@
   }
 
-  status = PclientCommand (host, line, PCLIENT_PROMPT, &buffer);
+  status = PclientCommand (host, line, PCLIENT_PROMPT, PCONTROL_RESP_START_JOB);
   free (line);
 
@@ -34,35 +32,44 @@
   switch (status) {
     case PCLIENT_DOWN:
+      // unlink host & job
       if (VerboseMode()) gprint (GP_ERR, "host %s is down\n", host[0].hostname);
-      goto failure;
-
-    case PCLIENT_HUNG:
-      // we need the job start to return a valid Job ID, 
-      // give up on jobs which don't get started.
-      // XXX we are sensitive here to the time it takes pclient
-      // to fork the job.  if this is slow, the client may appear to hang.
-      gprint (GP_ERR, "host %s is not responding (StartJob)\n", host[0].hostname);
-      if (VerboseMode()) gprint (GP_ERR, "host %s is not responding\n", host[0].hostname);
-
-      // unlink host & job
       job[0].host = NULL;
       host[0].job = NULL;
-      if (job[0].realhost) free (job[0].realhost);
-      job[0].realhost = NULL;
-      PutHost (host, PCONTROL_HOST_DONE, STACK_BOTTOM);
+      HarvestHost (host[0].pid);
+      PutHost (host, PCONTROL_HOST_DOWN, STACK_BOTTOM);
       PutJob (job, PCONTROL_JOB_PENDING, STACK_BOTTOM);
-      FreeIOBuffer (&buffer);
       return (FALSE);
 
     case PCLIENT_GOOD:
-      if (VerboseMode()) gprint (GP_ERR, "message received (StartJob)\n");  
-      break;
+      job[0].realhost = strcreate (host[0].hostname);
+      job[0].pid = -1;
+      gettimeofday (&job[0].start, (void *) NULL);
+
+      if (VerboseMode()) gprint (GP_ERR, "started job on host %s\n", host[0].hostname);  
+      PutHost (host, PCONTROL_HOST_RESP, STACK_BOTTOM);
+      PutJob (job, PCONTROL_JOB_BUSY, STACK_BOTTOM);
+      return (TRUE);
 
     default:
       ABORT ("unknown status for pclient command");  
   }
+}
+
+// message has been received from the host, interpret results
+int StartJobResponse (Host *host) {
+  
+  int status;
+  char *p;
+  IOBuffer *buffer;
+  Job *job;
+
+  /* job must have assigned host */
+  ASSERT (host, "missing host");
+  ASSERT (host[0].job, "missing job");
+  buffer = &host[0].comms_buffer;
+  job = (Job *) host[0].job;
 
   /* check on result of pclient command */
-  p = memstr (buffer.buffer, "STATUS", buffer.Nbuffer);
+  p = memstr (buffer[0].buffer, "STATUS", buffer[0].Nbuffer);
   ASSERT (p != NULL, "missing STATUS in pclient message");
 
@@ -71,5 +78,11 @@
     case -1:
       if (VerboseMode()) gprint (GP_ERR, "error in pclient child\n");
-      goto failure;
+      // unlink host & job
+      job[0].host = NULL;
+      host[0].job = NULL;
+      HarvestHost (host[0].pid);
+      PutHost (host, PCONTROL_HOST_DOWN, STACK_BOTTOM);
+      PutJob (job, PCONTROL_JOB_PENDING, STACK_BOTTOM);
+      return (FALSE);
 
     case -2:
@@ -80,23 +93,13 @@
 
     default:
-      job[0].realhost = strcreate (host[0].hostname);
+      if (VerboseMode()) gprint (GP_ERR, "message received (StartJobResponse)\n");  
       job[0].pid = status;
       PutHost (host, PCONTROL_HOST_BUSY, STACK_BOTTOM);
       PutJob (job, PCONTROL_JOB_BUSY, STACK_BOTTOM);
-      FreeIOBuffer (&buffer);
-      gettimeofday (&job[0].start, (void *) NULL);
+      gettimeofday (&job[0].start, NULL);
       return (TRUE);
   }
+
   /* we should never reach here */
   ABORT ("should not reach here (StartJob)");
-
-failure:
-  // unlink host & job
-  job[0].host = NULL;
-  host[0].job = NULL;
-  HarvestHost (host[0].pid);
-  PutHost (host, PCONTROL_HOST_DOWN, STACK_BOTTOM);
-  PutJob (job, PCONTROL_JOB_PENDING, STACK_BOTTOM);
-  FreeIOBuffer (&buffer);
-  return (FALSE);
 }
