Index: trunk/Ohana/src/opihi/pcontrol/JobOps.c
===================================================================
--- trunk/Ohana/src/opihi/pcontrol/JobOps.c	(revision 18085)
+++ trunk/Ohana/src/opihi/pcontrol/JobOps.c	(revision 18098)
@@ -1,5 +1,5 @@
 # include "pcontrol.h"
 
-// Stack *JobPool_AllJobs;
+Stack *JobPool_AllJobs;  // virtual pool for user status queries
 
 Stack *JobPool_Pending;
@@ -12,5 +12,5 @@
 
 void InitJobStacks () {
-  // JobPool_AllJobs = InitStack ();
+  JobPool_AllJobs = InitStack ();
 
   JobPool_Pending = InitStack ();
@@ -32,8 +32,4 @@
 
 void FreeJobStacks () {
-
-  // AllJobs is a virtual stack : all jobs are references
-  // FreeStack (JobPool_AllJobs);
-
   FreeJobStack (JobPool_Pending);
   FreeJobStack (JobPool_Busy   );
@@ -43,9 +39,12 @@
   FreeJobStack (JobPool_Exit   );
   FreeJobStack (JobPool_Crash  );
+
+  // AllJobs is a virtual stack : all jobs are references
+  FreeStack (JobPool_AllJobs);
 }
 
 char *GetJobStackName (int StackID) {
   switch (StackID) {
-    // case PCONTROL_JOB_ALLJOBS: return ("ALLJOBS");
+    case PCONTROL_JOB_ALLJOBS: return ("ALLJOBS");
 
     case PCONTROL_JOB_PENDING: return ("PENDING");
@@ -64,5 +63,5 @@
 Stack *GetJobStack (int StackID) {
   switch (StackID) {
-    // case PCONTROL_JOB_ALLJOBS: return (JobPool_AllJobs);
+    case PCONTROL_JOB_ALLJOBS: return (JobPool_AllJobs);
 
     case PCONTROL_JOB_PENDING: return (JobPool_Pending);
@@ -81,5 +80,5 @@
 Stack *GetJobStackByName (char *name) {
 
-  // if (!strcasecmp (name, "all"))     return (JobPool_AllJobs);
+  if (!strcasecmp (name, "all"))     return (JobPool_AllJobs);
 
   if (!strcasecmp (name, "pending")) return (JobPool_Pending);
@@ -186,9 +185,15 @@
   job[0].argv     = argv;
   job[0].hostname = hostname;
+  job[0].realhost = NULL;
+
+  job[0].exit_status = 0;
+  job[0].Reset    = FALSE;
+  job[0].stdout_size = 0;
+  job[0].stderr_size = 0;
+
   job[0].mode     = mode;
-  job[0].host     = NULL;
-  job[0].JobID    = NextJobID();
-  job[0].Reset    = FALSE;
-  job[0].realhost = NULL;
+
+  job[0].state = 0;
+  job[0].stack = 0;
 
   /* do this step on start? */
@@ -196,8 +201,16 @@
   InitIOBuffer (&job[0].stderr_buff, 0x1000);
 
+  job[0].dtime = 0.0;
+  job[0].pid = 0;
+
+  job[0].JobID    = NextJobID();
+  job[0].host     = NULL;
+
   JobID = job[0].JobID;
 
+  // Put a copy of all created jobs on the ALLJOBS stack
+  // This is a virtual stack: do not free the job from this stack
+  PutJob (job, PCONTROL_JOB_ALLJOBS, STACK_BOTTOM);
   PutJob (job, PCONTROL_JOB_PENDING, STACK_BOTTOM);
-  // PutJob (job, PCONTROL_JOB_ALLJOBS, STACK_BOTTOM);
 
   if (VerboseMode()) gprint (GP_ERR, "added new job\n");
@@ -208,4 +221,9 @@
 
   int i;
+
+  Job *copy;
+
+  copy = PullStackByID (JobPool_AllJobs, job[0].JobID);
+  ASSERT (copy == job, "programming error: ALLJOBS entry does not match");
 
   FREE (job[0].hostname);
