Index: trunk/Ohana/src/opihi/pcontrol/HostOps.c
===================================================================
--- trunk/Ohana/src/opihi/pcontrol/HostOps.c	(revision 8183)
+++ trunk/Ohana/src/opihi/pcontrol/HostOps.c	(revision 8296)
@@ -12,5 +12,5 @@
   HostPool_Done = InitStack ();
   HostPool_Down = InitStack ();
-  HostPool_Off = InitStack ();
+  HostPool_Off  = InitStack ();
 }
 
@@ -35,48 +35,14 @@
 }
 
-Host *FindHostStack (IDtype HostID) {
-
-  Host *host;
-
-  host = FindHostPtr (HostID, PCONTROL_HOST_IDLE);
-  if (host != NULL) return (host);
-
-  host = FindHostPtr (HostID, PCONTROL_HOST_DOWN);
-  if (host != NULL) return (host);
-
-  host = FindHostPtr (HostID, PCONTROL_HOST_DONE);
-  if (host != NULL) return (host);
-
-  host = FindHostPtr (HostID, PCONTROL_HOST_BUSY);
-  if (host != NULL) return (host);
-
-  host = FindHostPtr (HostID, PCONTROL_HOST_OFF);
-  if (host != NULL) return (host);
-
-  return (NULL);
-}
-
-int FindNamedHostStack (char *name) {
-
-  int N;
-
-  N = FindNamedHost (name, PCONTROL_HOST_IDLE);
-  if (N >= 0) return (PCONTROL_HOST_IDLE);
-
-  N = FindNamedHost (name, PCONTROL_HOST_DOWN);
-  if (N >= 0) return (PCONTROL_HOST_DOWN);
-
-  N = FindNamedHost (name, PCONTROL_HOST_DONE);
-  if (N >= 0) return (PCONTROL_HOST_DONE);
-
-  N = FindNamedHost (name, PCONTROL_HOST_BUSY);
-  if (N >= 0) return (PCONTROL_HOST_BUSY);
-
-  N = FindNamedHost (name, PCONTROL_HOST_OFF);
-  if (N >= 0) return (PCONTROL_HOST_OFF);
-
-  return (-1);
-}
-
+Stack *GetHostStackByName (char *name) {
+  if (!strcasecmp (name, "idle")) return (HostPool_Idle);
+  if (!strcasecmp (name, "down")) return (HostPool_Down);
+  if (!strcasecmp (name, "done")) return (HostPool_Done);
+  if (!strcasecmp (name, "busy")) return (HostPool_Busy);
+  if (!strcasecmp (name, "off"))  return (HostPool_Off);
+  return (NULL);
+}
+
+/* add host to position in stack */
 int PutHost (Host *host, int StackID, int where) {
 
@@ -88,90 +54,175 @@
 
   host[0].stack = StackID;
-  stat = PutStack (stack, where, host);
-  /* status (0, NULL); */
+  stat = PushStack (stack, where, host, host[0].HostID, host[0].hostname);
+  // XXX need to handle the error conditions, or we drop the host & leak memory
   return (stat);
 }
   
-Host *GetHost (int StackID, int where) {
-
-  Host *host;
-  Stack *stack;
-
-  stack = GetHostStack (StackID);
-  if (stack == NULL) return (NULL);
-
-  host = GetStack (stack, where);
-  return (host);
-}
-
-int FindHost (IDtype HostID, int StackID) {
-
-  int i;
-  Host *host;
-  Stack *stack;
-
-  stack = GetHostStack (StackID);
-  if (stack == NULL) return (-2);
-
-  for (i = 0; i < stack[0].Nobject; i++) {
-    host = (Host *) stack[0].object[i];
-    if (host[0].HostID == HostID) {
-      return (i);
-    }
-  }
-  return (-1);
-}
-
-Host *FindHostPtr (IDtype HostID, int StackID) {
-
-  int i;
-  Host *host;
-  Stack *stack;
-
-  stack = GetHostStack (StackID);
-  if (stack == NULL) return (NULL);
-
-  for (i = 0; i < stack[0].Nobject; i++) {
-    host = (Host *) stack[0].object[i];
-    if (host[0].HostID == HostID) {
-      return (host);
-    }
-  }
-  return (NULL);
-}
-
-Host *PullHost (IDtype HostID, int StackID) {
-  
-  int N;
-  Host *host;
-
-  N = FindHost (HostID, StackID);
-  if (N < 0) return (NULL);
-
-  host = GetHost (StackID, N);
-  if (host == NULL) {
-    gprint (GP_ERR, "programming error! host missing from stack\n");
-    exit (1);
-  }
-  return (host);
-}
-
-int FindNamedHost (char *name, int StackID) {
-
-  int i;
-  Host *host;
-  Stack *stack;
-
-  stack = GetHostStack (StackID);
-  if (stack == NULL) return (-2);
-
-  for (i = 0; i < stack[0].Nobject; i++) {
-    host = (Host *) stack[0].object[i];
-    if (!strcasecmp (host[0].hostname, name)) {
-      return (i);
-    }
-  }
-  return (-1);
-}
+/* find the host by ID in the defined host stacks */
+Host *PullHostByID (IDtype HostID, int *StackID) {
+
+  Host *host;
+
+  *StackID = PCONTROL_HOST_IDLE;
+  host = PullHostFromStackByID (*StackID, HostID);
+  if (host != NULL) return (host);
+
+  *StackID = PCONTROL_HOST_DOWN;
+  host = PullHostFromStackByID (*StackID, HostID);
+  if (host != NULL) return (host);
+
+  *StackID = PCONTROL_HOST_DONE;
+  host = PullHostFromStackByID (*StackID, HostID);
+  if (host != NULL) return (host);
+
+  *StackID = PCONTROL_HOST_BUSY;
+  host = PullHostFromStackByID (*StackID, HostID);
+  if (host != NULL) return (host);
+
+  *StackID = PCONTROL_HOST_OFF;
+  host = PullHostFromStackByID (*StackID, HostID);
+  if (host != NULL) return (host);
+
+  *StackID = -1;
+  return (NULL);
+}
+
+/* find the host by ID in the defined host stacks */
+Host *PullHostByName (char *name, int *StackID) {
+
+  Host *host;
+
+  *StackID = PCONTROL_HOST_IDLE;
+  host = PullHostFromStackByName (*StackID, name);
+  if (host != NULL) return (host);
+
+  *StackID = PCONTROL_HOST_DOWN;
+  host = PullHostFromStackByName (*StackID, name);
+  if (host != NULL) return (host);
+
+  *StackID = PCONTROL_HOST_DONE;
+  host = PullHostFromStackByName (*StackID, name);
+  if (host != NULL) return (host);
+
+  *StackID = PCONTROL_HOST_BUSY;
+  host = PullHostFromStackByName (*StackID, name);
+  if (host != NULL) return (host);
+
+  *StackID = PCONTROL_HOST_OFF;
+  host = PullHostFromStackByName (*StackID, name);
+  if (host != NULL) return (host);
+
+  *StackID = -1;
+  return (NULL);
+}
+
+Host *PullHostFromStackByID (int StackID, IDtype ID) {
+
+  Host *host;
+  Stack *stack;
+
+  stack = GetHostStack (StackID);
+  if (stack == NULL) return (NULL);
+
+  host = PullStackByID (stack, ID);
+  return (host);
+}
+
+Host *PullHostFromStackByName (int StackID, char *name) {
+
+  Host *host;
+  Stack *stack;
+
+  stack = GetHostStack (StackID);
+  if (stack == NULL) return (NULL);
+
+  host = PullStackByName (stack, name);
+  return (host);
+}
+
+/* find the host by ID in the defined host stacks (don't pull off stack) */
+/* the Find functions are not thread-safe: DROP */
+# if (0) 
+Host *FindHostByID (IDtype HostID, int *StackID) {
+
+  Host *host;
+
+  *StackID = PCONTROL_HOST_IDLE;
+  host = FindHostInStackByID (*StackID, HostID);
+  if (host != NULL) return (host);
+
+  *StackID = PCONTROL_HOST_DOWN;
+  host = FindHostInStackByID (*StackID, HostID);
+  if (host != NULL) return (host);
+
+  *StackID = PCONTROL_HOST_DONE;
+  host = FindHostInStackByID (*StackID, HostID);
+  if (host != NULL) return (host);
+
+  *StackID = PCONTROL_HOST_BUSY;
+  host = FindHostInStackByID (*StackID, HostID);
+  if (host != NULL) return (host);
+
+  *StackID = PCONTROL_HOST_OFF;
+  host = FindHostInStackByID (*StackID, HostID);
+  if (host != NULL) return (host);
+
+  *StackID = -1;
+  return (NULL);
+}
+
+/* find the host by Name in the defined host stacks (don't pull off stack) */
+Host *FindHostByName (char *name, int *StackID) {
+
+  Host *host;
+
+  *StackID = PCONTROL_HOST_IDLE;
+  host = FindHostInStackByName (*StackID, name);
+  if (host != NULL) return (host);
+
+  *StackID = PCONTROL_HOST_DOWN;
+  host = FindHostInStackByName (*StackID, name);
+  if (host != NULL) return (host);
+
+  *StackID = PCONTROL_HOST_DONE;
+  host = FindHostInStackByName (*StackID, name);
+  if (host != NULL) return (host);
+
+  *StackID = PCONTROL_HOST_BUSY;
+  host = FindHostInStackByName (*StackID, name);
+  if (host != NULL) return (host);
+
+  *StackID = PCONTROL_HOST_OFF;
+  host = FindHostInStackByName (*StackID, name);
+  if (host != NULL) return (host);
+
+  *StackID = -1;
+  return (NULL);
+}
+
+Host *FindHostInStackByID (int StackID, IDtype ID) {
+
+  Host *host;
+  Stack *stack;
+
+  stack = GetHostStack (StackID);
+  if (stack == NULL) return (NULL);
+
+  host = FindStackByID (stack, ID);
+  return (host);
+}
+
+Host *FindHostInStackByName (int StackID, char *name) {
+
+  Host *host;
+  Stack *stack;
+
+  stack = GetHostStack (StackID);
+  if (stack == NULL) return (NULL);
+
+  host = FindStackByName (stack, name);
+  return (host);
+}
+# endif
 
 IDtype AddHost (char *hostname) {
