Index: trunk/Ohana/src/opihi/include/pcontrol.h
===================================================================
--- trunk/Ohana/src/opihi/include/pcontrol.h	(revision 3187)
+++ trunk/Ohana/src/opihi/include/pcontrol.h	(revision 3203)
@@ -7,28 +7,44 @@
 # include <sys/wait.h>
 
-/** pcontrol global data **/
+typedef struct timeval Ptime;
+typedef unsigned long long IDtype;
 
 /** job status values **/
-enum {
+typedef enum {
   PCONTROL_JOB_PENDING,
   PCONTROL_JOB_BUSY,  
   PCONTROL_JOB_EXIT,
   PCONTROL_JOB_CRASH,
+  PCONTROL_JOB_HUNG,  
+  PCONTROL_JOB_DONE,  
 } JobStat;
 
 /** job status values **/
-enum {
+typedef enum {
   PCONTROL_JOB_ANYHOST,
   PCONTROL_JOB_WANTHOST,
-  PCONTROL_JOB_NEEDHOST,  
+  PCONTROL_JOB_NEEDHOST,
 } JobMode;
 
 /** host status values **/
-enum {
+typedef enum {
   PCONTROL_HOST_IDLE,
   PCONTROL_HOST_BUSY,  
   PCONTROL_HOST_DOWN,
+  PCONTROL_HOST_DONE,
   PCONTROL_HOST_OFF,
 } HostStat;
+
+/* stack special positions */
+typedef enum {
+  STACK_TOP = 0,
+  STACK_BOTTOM = -1,
+} StackWhere;
+
+typedef enum {
+  PCLIENT_HUNG = -1,
+  PCLIENT_DOWN = 0,
+  PCLIENT_GOOD = 1,
+} PclientStat;
 
 typedef struct {
@@ -49,36 +65,37 @@
 } Fifo;
 
-typedef struct timeval Ptime;
-
 /* data to define a job */
 typedef struct {
-  int        argc; 
-  char     **argv;
-  char      *hostname;
-  int        exitstatus;
-  JobMode    mode;
-  JobStat    status;
-  IOBuffer   stdin;
-  IOBuffer   stdout;
-  IOBuffer   stderr;
-  Ptime      start;
-  Ptime      accum;
-  Ptime      timer;
+  int          argc; 
+  char       **argv;
+  char        *hostname;
+  int          exit_status;
+  int          Reset;
+  JobMode      mode;
+  JobStat      state;
+  JobStat      stack;
+  IOBuffer     stdout;
+  IOBuffer     stderr;
+  Ptime        start;
+  Ptime        accum;
+  Ptime        timer;
   struct Host *host;
-  int        pid;
-  IDtype     JobID;
+  int          pid;
+  IDtype       JobID;
 } Job;
 
 /* data to define a host machine */
 typedef struct {
-  char      *hostname;
-  int        stdin;
-  int        stdout;
-  int        stderr;
-  int        markoff;
-  HostStat   status;
-  Ptime      start;
-  Ptime      accum;
-  Ptime      timer;
+  char       *hostname;
+  int         stdin;
+  int         stdout;
+  int         stderr;
+  int         markoff;
+  int         pid;
+  HostStat    stack;
+  Ptime       start;
+  Ptime       accum;
+  Ptime       timer;
+  IDtype      HostID;
   struct Job *job;
 } Host;
@@ -88,8 +105,12 @@
   int    Nobject;
   int    NOBJECT;
-} Queue;
+} Stack;
 
+/* these should be loaded from ConfigInit or from opihi variables */
 static char *CONNECT;  /* connection method (ssh, rsh, etc) */
 static char *PCLIENT;  /* shell on remote host (eg, pclient) */
+
+# define FREE(X) if (X != NULL) { free (X); }
+# define CLOSE(FD) { if (FD) close (FD); FD = 0; }
 
 /** IOBuffers allow the following operations (see pclient.h) **/
@@ -99,9 +120,44 @@
 void FreeIOBuffer (IOBuffer *buffer);
 
-# define FREE(X) if (X != NULL) { free (X); }
-
-enum {
-  QUEUE_TOP = 0,
-  QUEUE_BOTTOM = -1,
-} QueueWhere;
-
+void *GetStack (Stack *stack, int where);
+int PutStack (Stack *stack, int where, void *object);
+Stack *InitStack ();
+Stack *GetHostStack (int StackID);
+int PutHost (Host *host, int StackID, int where);
+Host *GetHost (int StackID, int where);
+int FindHost (IDtype HostID, int StackID);
+int FindNamedHost (char *name, int StackID);
+void AddHost (char *hostname);
+void DownHost (Host *host);
+void DelHost (Host *host);
+int CheckSystem ();
+int CheckBusyJobs ();
+int CheckDoneJobs ();
+int CheckDoneHosts ();
+int CheckLiveHosts ();
+int CheckDownHosts ();
+int CheckIdleHosts ();
+int CheckIdleHost (Host *host);
+void InitIDs ();
+IDtype NextJobID ();
+IDtype NextHostID ();
+void PrintID (FILE *f, IDtype ID);
+int CheckBusyJob (Job *job);
+int StartHost (Host *host);
+int CheckDoneHost (Host *host);
+int CheckDoneJob (Job *job);
+int GetJobOutput (Job *job, char *channel);
+int ResetJob (Job *job);
+int PclientCommand (Host *host, char *command, IOBuffer *buffer);
+int rconnect (char *command, char *hostname, char *shell, int *stdio);
+int CheckHost (Host *host);
+char *memstr (char *m1, char *m2, int n);
+Stack *GetJobStack (int StackID);
+int PutJob (Job *job, int StackID, int where);
+Job *GetJob (int StackID, int where);
+int FindJob (IDtype JobID, int StackID);
+IDtype AddJob (char *hostname, JobMode mode, int timeout, int argc, char **argv);
+void KillJob (Job *job);
+void DelJob (Job *job);
+Host *UnlinkJobAndHost (Job *job);
+void LinkJobAndHost (Job *job, Host *host);
