Index: /trunk/Ohana/src/opihi/doc/scheduler.txt
===================================================================
--- /trunk/Ohana/src/opihi/doc/scheduler.txt	(revision 4572)
+++ /trunk/Ohana/src/opihi/doc/scheduler.txt	(revision 4573)
@@ -1,2 +1,10 @@
+
+2005.07.15
+
+The controller sends messages to both stdout and stderr.  I can easily
+require the messages which are immediate responses to external
+commands (status, check, etc) go back on stdout.  other messages
+should go to stderr, or be suppressed.  I suppose i can regularly
+harvest the stderr messages?
 
 2005.07.14
@@ -50,6 +58,4 @@
 - allow the 'periods' command to define defaults when outside of a
   task
-
-- 
 
 2005.07.05
Index: /trunk/Ohana/src/opihi/include/pcontrol.h
===================================================================
--- /trunk/Ohana/src/opihi/include/pcontrol.h	(revision 4572)
+++ /trunk/Ohana/src/opihi/include/pcontrol.h	(revision 4573)
@@ -134,5 +134,5 @@
 Host *PullHost (IDtype HostID, int StackID);
 int FindNamedHost (char *name, int StackID);
-void AddHost (char *hostname);
+IDtype AddHost (char *hostname);
 void DownHost (Host *host);
 void OffHost (Host *host);
Index: /trunk/Ohana/src/opihi/include/scheduler.h
===================================================================
--- /trunk/Ohana/src/opihi/include/scheduler.h	(revision 4572)
+++ /trunk/Ohana/src/opihi/include/scheduler.h	(revision 4573)
@@ -83,5 +83,5 @@
 } Job;
 
-# define CONTROLLER_PROMPT "pclient:"
+# define CONTROLLER_PROMPT "pcontrol:"
 
 /* scheduler prototypes */
Index: /trunk/Ohana/src/opihi/pantasks/CheckSystem.c
===================================================================
--- /trunk/Ohana/src/opihi/pantasks/CheckSystem.c	(revision 4572)
+++ /trunk/Ohana/src/opihi/pantasks/CheckSystem.c	(revision 4573)
@@ -5,4 +5,5 @@
   CheckTasks ();
   CheckJobs ();
+  CheckControllerOutput ();
 
 }
Index: /trunk/Ohana/src/opihi/pantasks/ControllerOps.c
===================================================================
--- /trunk/Ohana/src/opihi/pantasks/ControllerOps.c	(revision 4572)
+++ /trunk/Ohana/src/opihi/pantasks/ControllerOps.c	(revision 4573)
@@ -5,4 +5,6 @@
 static int status = FALSE;
 static int stdin_cntl, stdout_cntl, stderr_cntl;
+static IOBuffer stdout_buffer;
+static IOBuffer stderr_buffer;
 
 int CheckControllerStatus () {
@@ -108,5 +110,5 @@
   line = NULL;
   status = -1;
-  for (i = 0; (i < CONTROLLER_TIMEOUT) && (status == -1) && (line == NULL); i++) {
+  for (i = 0; (i < CONTROLLER_TIMEOUT) && (status != 0) && (line == NULL); i++) {
     status = ReadtoIOBuffer (buffer, stdout_cntl);
     if ((buffer[0].Nbuffer - Nstart) >= Nbytes) {
@@ -261,5 +263,5 @@
   p = NULL;
   status = -1;
-  for (i = 0; (i < CONNECT_TIMEOUT) && (status == -1) && (p == NULL); i++) {
+  for (i = 0; (i < CONNECT_TIMEOUT) && (status != 0) && (p == NULL); i++) {
     status = ReadtoIOBuffer (&buffer, stdout_fd[0]);
     p = memstr (buffer.buffer, "CONNECTED", buffer.Nbuffer);
@@ -274,4 +276,7 @@
   stdout_cntl = stdout_fd[0];
   stderr_cntl = stderr_fd[0];
+
+  InitIOBuffer (&stdout_buffer, 0x100);
+  InitIOBuffer (&stderr_buffer, 0x100);
 
   fprintf (stderr, "Connected\n");
@@ -319,5 +324,5 @@
   line = NULL;
   status = -1;
-  for (i = 0; (i < CONTROLLER_TIMEOUT) && (status == -1) && (line == NULL); i++) {
+  for (i = 0; (i < CONTROLLER_TIMEOUT) && (status != 0) && (line == NULL); i++) {
     status = ReadtoIOBuffer (buffer, stdout_cntl);
     line = memstr (buffer[0].buffer, response, buffer[0].Nbuffer);
@@ -330,3 +335,50 @@
 }
 
+int CheckControllerOutput () {
+
+  int Nread;
+
+  /* read stdout buffer */
+  Nread = ReadtoIOBuffer (&stdout_buffer, stdout_cntl);
+  switch (Nread) {
+    case -2:  /* error in read (programming error?  system level error?) */
+      fprintf (stderr, "serious IO error\n");
+      exit (2);
+    case -1:  /* no data in pipe */
+      break;
+    case 0:   /* pipe is closed */
+      /** change child state? **/
+      break;
+    default:  /* data in pipe */
+      break;
+  }
+  
+  /* read stderr buffer */
+  Nread = ReadtoIOBuffer (&stderr_buffer, stderr_cntl);
+  switch (Nread) {
+    case -2:  /* error in read (programming error?  system level error?) */
+      fprintf (stderr, "serious IO error\n");
+      exit (2);
+    case -1:  /* no data in pipe */
+      break;
+    case 0:   /* pipe is closed */
+      /** change child state? **/
+      break;
+    default:  /* data in pipe */
+      break;
+  }
+  return (TRUE);
+}
+
+int PrintControllerOutput () {
+
+  fprintf (stderr, "--- stdout ---\n");
+  fwrite (stdout_buffer.buffer, 1, stdout_buffer.Nbuffer, stderr);
+  fprintf (stderr, "--- stdout ---\n");
+  fwrite (stderr_buffer.buffer, 1, stderr_buffer.Nbuffer, stderr);
+  fprintf (stderr, "---  done  ---\n");
+  return (TRUE);
+}
+
+
 /* memstr returns a view, not an allocated string : don't free */
Index: /trunk/Ohana/src/opihi/pantasks/Makefile
===================================================================
--- /trunk/Ohana/src/opihi/pantasks/Makefile	(revision 4572)
+++ /trunk/Ohana/src/opihi/pantasks/Makefile	(revision 4573)
@@ -48,4 +48,5 @@
 $(SDIR)/controller_check.$(ARCH).o \
 $(SDIR)/controller_status.$(ARCH).o \
+$(SDIR)/controller_output.$(ARCH).o \
 $(SDIR)/task.$(ARCH).o \
 $(SDIR)/task_command.$(ARCH).o \
Index: /trunk/Ohana/src/opihi/pantasks/controller.c
===================================================================
--- /trunk/Ohana/src/opihi/pantasks/controller.c	(revision 4572)
+++ /trunk/Ohana/src/opihi/pantasks/controller.c	(revision 4573)
@@ -4,9 +4,11 @@
 int controller_status  PROTO((int, char **));
 int controller_check   PROTO((int, char **));
+int controller_output  PROTO((int, char **));
 
 static Command controller_cmds[] = {
   {"host",   controller_host,   "define host for controller"},
+  {"check",  controller_check,  "check controller host/job"},
   {"status", controller_status, "check controller status"},
-  {"check",  controller_check,  "check controller host/job"},
+  {"output", controller_output, "print controller output"},
 };
 
Index: /trunk/Ohana/src/opihi/pantasks/controller_check.c
===================================================================
--- /trunk/Ohana/src/opihi/pantasks/controller_check.c	(revision 4572)
+++ /trunk/Ohana/src/opihi/pantasks/controller_check.c	(revision 4573)
@@ -8,6 +8,6 @@
 
   if (argc != 3) goto usage;
-  if (strcasecmp (argv[2], "JOB") && 
-      strcasecmp (argv[2], "HOST")) goto usage;
+  if (strcasecmp (argv[1], "JOB") && 
+      strcasecmp (argv[1], "HOST")) goto usage;
 
   /* check if controller is running */
@@ -18,5 +18,5 @@
   }
 
-  sprintf (command, "check %s %s", argv[2], argv[3]);
+  sprintf (command, "check %s %s", argv[1], argv[2]);
   InitIOBuffer (&buffer, 0x100);
   status = ControllerCommand (command, CONTROLLER_PROMPT, &buffer);
Index: /trunk/Ohana/src/opihi/pantasks/controller_host.c
===================================================================
--- /trunk/Ohana/src/opihi/pantasks/controller_host.c	(revision 4572)
+++ /trunk/Ohana/src/opihi/pantasks/controller_host.c	(revision 4573)
@@ -7,5 +7,5 @@
   IOBuffer buffer;
 
-  if (argc != 3) {
+  if (argc != 2) {
     fprintf (stderr, "USAGE: controller host (hostname)\n");
     return (FALSE);
@@ -15,5 +15,5 @@
   StartController ();
 
-  sprintf (command, "host %s", argv[2]);
+  sprintf (command, "host %s", argv[1]);
   InitIOBuffer (&buffer, 0x100);
   status = ControllerCommand (command, CONTROLLER_PROMPT, &buffer);
@@ -32,4 +32,6 @@
     case CONTROLLER_GOOD:
       fprintf (stderr, "controller command sent\n");  
+      fwrite (buffer.buffer, 1, buffer.Nbuffer, stderr);
+      fprintf (stderr, "\n Nbytes received: %d\n", buffer.Nbuffer);  
       return (TRUE);
 
Index: /trunk/Ohana/src/opihi/pantasks/controller_output.c
===================================================================
--- /trunk/Ohana/src/opihi/pantasks/controller_output.c	(revision 4573)
+++ /trunk/Ohana/src/opihi/pantasks/controller_output.c	(revision 4573)
@@ -0,0 +1,16 @@
+# include "scheduler.h"
+
+int controller_output (int argc, char **argv) {
+
+  int status;
+  char command[1024];
+  IOBuffer buffer;
+
+  if (argc != 1) {
+    fprintf (stderr, "USAGE: controller status\n");
+    return (FALSE);
+  }
+
+  PrintControllerOutput ();
+  return (TRUE);
+}
Index: /trunk/Ohana/src/opihi/pantasks/controller_status.c
===================================================================
--- /trunk/Ohana/src/opihi/pantasks/controller_status.c	(revision 4572)
+++ /trunk/Ohana/src/opihi/pantasks/controller_status.c	(revision 4573)
@@ -7,5 +7,5 @@
   IOBuffer buffer;
 
-  if (argc != 3) {
+  if (argc != 1) {
     fprintf (stderr, "USAGE: controller status\n");
     return (FALSE);
@@ -37,4 +37,5 @@
       fprintf (stderr, "controller command sent\n");  
       fwrite (buffer.buffer, 1, buffer.Nbuffer, stderr);
+      fprintf (stderr, "\n Nbytes received: %d\n", buffer.Nbuffer);  
       return (TRUE);
 
Index: /trunk/Ohana/src/opihi/pclient/job.c
===================================================================
--- /trunk/Ohana/src/opihi/pclient/job.c	(revision 4572)
+++ /trunk/Ohana/src/opihi/pclient/job.c	(revision 4573)
@@ -3,5 +3,6 @@
 int job (int argc, char **argv) {
 
-  int pid, status;
+  int i, pid, status;
+  char **targv;
 
   if (argc < 2) {
@@ -20,4 +21,11 @@
   if (pipe (child_stdout_fd) < 0) goto pipe_error;
   if (pipe (child_stderr_fd) < 0) goto pipe_error;
+
+  /* need to define arg list with NULL termination */
+  ALLOCATE (targv, char *, argc);
+  for (i = 1; i < argc; i++) {
+    targv[i-1] = strcreate (argv[i]);
+  }
+  targv[i] = 0;
 
   pid = fork ();
@@ -39,9 +47,7 @@
     setvbuf (stdout, (char *) NULL, _IONBF, BUFSIZ);
     setvbuf (stderr, (char *) NULL, _IONBF, BUFSIZ);
-    /* fprintf (stderr, "child is spawned, executing command\n"); */
-    /* note that this message comes out on the other side of the stderr pipe */
 
     /* exec job */ 
-    status = execvp (argv[1], &argv[1]); 
+    status = execvp (targv[0], targv); 
     fprintf (stderr, "error starting child process: %d\n", status);
     exit (1);
Index: /trunk/Ohana/src/opihi/pcontrol/GetJobOutput.c
===================================================================
--- /trunk/Ohana/src/opihi/pcontrol/GetJobOutput.c	(revision 4572)
+++ /trunk/Ohana/src/opihi/pcontrol/GetJobOutput.c	(revision 4573)
@@ -25,5 +25,5 @@
   line = NULL;
   status = -1;
-  for (i = 0; (i < PCLIENT_TIMEOUT) && (status == -1) && (line == NULL); i++) {
+  for (i = 0; (i < PCLIENT_TIMEOUT) && (status != 0) && (line == NULL); i++) {
     status = ReadtoIOBuffer (buffer, host[0].stdout);
     if ((buffer[0].Nbuffer - Nstart) >= Nbytes) {
Index: /trunk/Ohana/src/opihi/pcontrol/HostOps.c
===================================================================
--- /trunk/Ohana/src/opihi/pcontrol/HostOps.c	(revision 4572)
+++ /trunk/Ohana/src/opihi/pcontrol/HostOps.c	(revision 4573)
@@ -153,5 +153,5 @@
 }
 
-void AddHost (char *hostname) {
+IDtype AddHost (char *hostname) {
 
   Host *host;
@@ -168,4 +168,5 @@
   host[0].job      = NULL;
   PutHost (host, PCONTROL_HOST_DOWN, STACK_BOTTOM);
+  return (host[0].HostID);
 }
 
Index: /trunk/Ohana/src/opihi/pcontrol/check.c
===================================================================
--- /trunk/Ohana/src/opihi/pcontrol/check.c	(revision 4572)
+++ /trunk/Ohana/src/opihi/pcontrol/check.c	(revision 4573)
@@ -10,6 +10,6 @@
 
   if (argc != 3) {
-    fprintf (stderr, "USAGE: check job (JobID)\n");
-    fprintf (stderr, "USAGE: check host (HostID)\n");
+    fprintf (stdout, "USAGE: check job (JobID)\n");
+    fprintf (stdout, "USAGE: check host (HostID)\n");
     return (FALSE);
   }
@@ -40,5 +40,5 @@
   }
 
-  fprintf (stderr, "unknown item to check\n");
+  fprintf (stdout, "unknown item to check\n");
   return (FALSE);
 }
Index: /trunk/Ohana/src/opihi/pcontrol/host.c
===================================================================
--- /trunk/Ohana/src/opihi/pcontrol/host.c	(revision 4572)
+++ /trunk/Ohana/src/opihi/pcontrol/host.c	(revision 4573)
@@ -3,4 +3,5 @@
 int host (int argc, char **argv) {
 
+  IDtype HostID;
   int N, Delete, Off, On, Start, Stop, Check;
   Host *host;
@@ -17,5 +18,5 @@
   if ((N = get_argument (argc, argv, "-off"))) {
     if (Delete) {
-      fprintf (stderr, "-delete and -off incompatible\n");
+      fprintf (stdout, "-delete and -off incompatible\n");
       return (FALSE);
     }
@@ -28,5 +29,5 @@
   if ((N = get_argument (argc, argv, "-on"))) {
     if (Delete || Off) {
-      fprintf (stderr, "only one of -delete, -off, -on\n");
+      fprintf (stdout, "only one of -delete, -off, -on\n");
       return (FALSE);
     }
@@ -57,5 +58,5 @@
  
   if (argc != 2) {
-    fprintf (stderr, "USAGE: host (hostname) [-delete]\n");
+    fprintf (stdout, "USAGE: host (hostname) [-delete]\n");
     return (FALSE);
   }
@@ -64,5 +65,5 @@
     N = FindNamedHost (argv[1], PCONTROL_HOST_OFF);
     if (N < 0) {
-      fprintf (stderr, "host %s is not OFF\n", argv[1]);
+      fprintf (stdout, "host %s is not OFF\n", argv[1]);
       return (FALSE);
     }
@@ -75,5 +76,5 @@
     N = FindNamedHost (argv[1], PCONTROL_HOST_OFF);
     if (N < 0) {
-      fprintf (stderr, "host %s is not OFF\n", argv[1]);
+      fprintf (stdout, "host %s is not OFF\n", argv[1]);
       return (FALSE);
     }
@@ -96,5 +97,5 @@
       return (TRUE);
     }
-    fprintf (stderr, "host %s is not BUSY or IDLE\n", argv[1]);
+    fprintf (stdout, "host %s is not BUSY or IDLE\n", argv[1]);
     return (FALSE);
   }
@@ -103,5 +104,5 @@
     N = FindNamedHost (argv[1], PCONTROL_HOST_DOWN);
     if (N < 0) {
-      fprintf (stderr, "host %s is not DOWN\n", argv[1]);
+      fprintf (stdout, "host %s is not DOWN\n", argv[1]);
       return (FALSE);
     }
@@ -113,5 +114,5 @@
     N = FindNamedHost (argv[1], PCONTROL_HOST_IDLE);
     if (N < 0) {
-      fprintf (stderr, "host %s is not IDLE\n", argv[1]);
+      fprintf (stdout, "host %s is not IDLE\n", argv[1]);
       return (FALSE);
     }
@@ -143,9 +144,10 @@
       return (TRUE);
     }
-    fprintf (stderr, "host %s is not BUSY, IDLE, or DOWN\n", argv[1]);
+    fprintf (stdout, "host %s is not BUSY, IDLE, or DOWN\n", argv[1]);
     return (FALSE);
   }
 
-  AddHost (argv[1]);
+  HostID = AddHost (argv[1]);
+  fprintf (stdout, "HostID: %d\n", HostID);
   return (TRUE);
 }
Index: /trunk/Ohana/src/opihi/pcontrol/pclient.c
===================================================================
--- /trunk/Ohana/src/opihi/pcontrol/pclient.c	(revision 4572)
+++ /trunk/Ohana/src/opihi/pcontrol/pclient.c	(revision 4573)
@@ -24,5 +24,5 @@
   line = NULL;
   status = -1;
-  for (i = 0; (i < PCLIENT_TIMEOUT) && (status == -1) && (line == NULL); i++) {
+  for (i = 0; (i < PCLIENT_TIMEOUT) && (status != 0) && (line == NULL); i++) {
     status = ReadtoIOBuffer (buffer, host[0].stdout);
     line = memstr (buffer[0].buffer, response, buffer[0].Nbuffer);
Index: /trunk/Ohana/src/opihi/pcontrol/rconnect.c
===================================================================
--- /trunk/Ohana/src/opihi/pcontrol/rconnect.c	(revision 4572)
+++ /trunk/Ohana/src/opihi/pcontrol/rconnect.c	(revision 4573)
@@ -76,5 +76,5 @@
   p = NULL;
   status = -1;
-  for (i = 0; (i < CONNECT_TIMEOUT) && (status == -1) && (p == NULL); i++) {
+  for (i = 0; (i < CONNECT_TIMEOUT) && (status != 0) && (p == NULL); i++) {
     status = ReadtoIOBuffer (&buffer, stdout_fd[0]);
     p = memstr (buffer.buffer, "CONNECTED", buffer.Nbuffer);
Index: /trunk/Ohana/src/opihi/pcontrol/status.c
===================================================================
--- /trunk/Ohana/src/opihi/pcontrol/status.c	(revision 4572)
+++ /trunk/Ohana/src/opihi/pcontrol/status.c	(revision 4573)
@@ -30,14 +30,14 @@
   stack = GetJobStack (Nstack);
   Nobject = stack[0].Nobject;
-  fprintf (stderr, "job stack %s:  %d objects\n", jobname[Nstack], Nobject);
+  fprintf (stdout, "job stack %s:  %d objects\n", jobname[Nstack], Nobject);
 
   for (i = 0; i < Nobject; i++) {
     job = stack[0].object[i];
-    fprintf (stderr, "%d  %s  %d  ", i, job[0].hostname, job[0].argc);
+    fprintf (stdout, "%d  %s  %d  ", i, job[0].hostname, job[0].argc);
     for (j = 0; j < job[0].argc; j++) {
-      fprintf (stderr, "%s ", job[0].argv[j]);
+      fprintf (stdout, "%s ", job[0].argv[j]);
     }
-    PrintID (stderr, job[0].JobID);
-    fprintf (stderr, "\n");
+    PrintID (stdout, job[0].JobID);
+    fprintf (stdout, "\n");
   }
 }
@@ -51,11 +51,11 @@
   stack = GetHostStack (Nstack);
   Nobject = stack[0].Nobject;
-  fprintf (stderr, "host stack %s:  %d objects\n", hostname[Nstack], Nobject);
+  fprintf (stdout, "host stack %s:  %d objects\n", hostname[Nstack], Nobject);
 
   for (i = 0; i < Nobject; i++) {
     host = stack[0].object[i];
-    fprintf (stderr, "%d  %s  ", i, host[0].hostname);
-    PrintID (stderr, host[0].HostID);
-    fprintf (stderr, "\n");
+    fprintf (stdout, "%d  %s  ", i, host[0].hostname);
+    PrintID (stdout, host[0].HostID);
+    fprintf (stdout, "\n");
   }
 }
