Index: trunk/Ohana/src/opihi/pcontrol/CheckBusyJob.c
===================================================================
--- trunk/Ohana/src/opihi/pcontrol/CheckBusyJob.c	(revision 16456)
+++ trunk/Ohana/src/opihi/pcontrol/CheckBusyJob.c	(revision 17475)
@@ -4,9 +4,5 @@
 int CheckBusyJob (Job *job, Host *host) {
 
-  int      status;
-  int      outstate;
-  char    *p;
-  char     string[64];
-  IOBuffer buffer;
+  int status;
 
   /* we are checking a job which is currently busy.  it has been pulled from the
@@ -16,51 +12,53 @@
   ASSERT (job, "job not set");
   ASSERT (host, "host not set");
-
   ASSERT (host == (Host *) job[0].host, "invalid host");
   ASSERT (job  == (Job *) host[0].job, "invalid job");
 
-  InitIOBuffer (&buffer, 0x100);
-
-  status = PclientCommand (host, "status", PCLIENT_PROMPT, &buffer);
+  status = PclientCommand (host, "status", PCLIENT_PROMPT, PCONTROL_RESP_CHECK_BUSY_JOB);
 
   /* check on success of pclient command */
   switch (status) {
     case PCLIENT_DOWN:
-      HarvestHost (host[0].pid);
+      // free the realhost name
+      if (job[0].realhost) free (job[0].realhost);
+      job[0].realhost = NULL;
+
       // unlink host & job
+      if (VerboseMode()) gprint (GP_ERR, "host %s is down\n", host[0].hostname);
       job[0].host = NULL;
       host[0].job = NULL;
-      if (job[0].realhost) free (job[0].realhost);
-      job[0].realhost = NULL;
+      HarvestHost (host[0].pid);
       PutHost (host, PCONTROL_HOST_DOWN, STACK_BOTTOM);
       PutJob (job, PCONTROL_JOB_PENDING, STACK_BOTTOM);
-      FreeIOBuffer (&buffer);
       return (FALSE);
-
-    case PCLIENT_HUNG:
-      // don't do anything drastic, just keep trying
-      if (DEBUG || VerboseMode()) gprint (GP_ERR, "client is busy, not responding");
-      PutHost (host, PCONTROL_HOST_BUSY, STACK_BOTTOM);
-      PutJob (job, PCONTROL_JOB_BUSY, STACK_BOTTOM);
-      FreeIOBuffer (&buffer);
-      return (TRUE);
 
     case PCLIENT_GOOD:
       if (DEBUG || VerboseMode()) gprint (GP_ERR, "message received (CheckBusyJob)");
-      break;
+      PutHost (host, PCONTROL_HOST_RESP, STACK_BOTTOM);
+      PutJob (job, PCONTROL_JOB_BUSY, STACK_BOTTOM);
+      return (TRUE);
 
     default:
       ABORT ("unknown status for pclient command");  
   }
+}
+
+int CheckBusyJobResponse (Host *host) {
+
+  int      outstate;
+  char    *p;
+  char     string[64];
+  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;
 
   /** host is up, need to parse message **/
-  p = memstr (buffer.buffer, "STATUS", buffer.Nbuffer);
-  // this condition means the message is garbage.  toss it and try again
-  if (p == NULL) {
-    PutHost (host, PCONTROL_HOST_BUSY, STACK_BOTTOM);
-    PutJob (job, PCONTROL_JOB_BUSY, STACK_BOTTOM);
-    FreeIOBuffer (&buffer);
-    return (FALSE);
-  }
+  p = memstr (buffer[0].buffer, "STATUS", buffer[0].Nbuffer);
+  ASSERT (p != NULL, "missing STATUS in pclient message");
 
   sscanf (p, "%*s %s", string);
@@ -71,5 +69,4 @@
     PutHost (host, PCONTROL_HOST_BUSY, STACK_BOTTOM);
     PutJob (job, PCONTROL_JOB_BUSY, STACK_BOTTOM);
-    FreeIOBuffer (&buffer);
     return (TRUE);
   }
@@ -79,12 +76,12 @@
   if (!strcmp(string, "EXIT")) outstate = PCONTROL_JOB_EXIT;
   if (!strcmp(string, "CRASH")) outstate = PCONTROL_JOB_CRASH;
-  ASSERT (outstate != PCONTROL_JOB_BUSY, "should not reach here (CheckJob)");
+  ASSERT (outstate != PCONTROL_JOB_BUSY, "invalid status response (CheckBusyJobResponse)");
 
   /* parse the exit status and sizes of output buffers */
-  p = memstr (buffer.buffer, "EXITST", buffer.Nbuffer);
+  p = memstr (buffer[0].buffer, "EXITST", buffer[0].Nbuffer);
   sscanf (p, "%*s %d", &job[0].exit_status);
-  p = memstr (buffer.buffer, "STDOUT", buffer.Nbuffer);
+  p = memstr (buffer[0].buffer, "STDOUT", buffer[0].Nbuffer);
   sscanf (p, "%*s %d", &job[0].stdout_size);
-  p = memstr (buffer.buffer, "STDERR", buffer.Nbuffer);
+  p = memstr (buffer[0].buffer, "STDERR", buffer[0].Nbuffer);
   sscanf (p, "%*s %d", &job[0].stderr_size);
 
@@ -98,7 +95,6 @@
   PutHost (host, PCONTROL_HOST_BUSY, STACK_BOTTOM);
   PutJobSetState (job, PCONTROL_JOB_DONE, STACK_BOTTOM, outstate);
-  gettimeofday (&job[0].stop, (void *) NULL);
+  gettimeofday (&job[0].stop, NULL);
   job[0].dtime = DTIME(job[0].stop, job[0].start);
-  FreeIOBuffer (&buffer);
   return (TRUE);
 }
