Index: /branches/eam_branches/ipp-20130904/Ohana/src/opihi/include/pcontrol.h
===================================================================
--- /branches/eam_branches/ipp-20130904/Ohana/src/opihi/include/pcontrol.h	(revision 36143)
+++ /branches/eam_branches/ipp-20130904/Ohana/src/opihi/include/pcontrol.h	(revision 36144)
@@ -8,4 +8,5 @@
 /** job status values **/
 typedef enum {
+  PCONTROL_JOB_NONE, // XXX OK?
   PCONTROL_JOB_ALLJOBS,
   PCONTROL_JOB_PENDING,
@@ -309,4 +310,5 @@
 char  *GetJobStackName (int StackID);
 Stack *GetJobStackByName (char *name);
+int GetJobStackIDbyName (char *name);
 int    PutJob (Job *job, int StackID, int where);
 int    PutJobSetState (Job *job, int StackID, int where, int state);
Index: /branches/eam_branches/ipp-20130904/Ohana/src/opihi/pcontrol/JobOps.c
===================================================================
--- /branches/eam_branches/ipp-20130904/Ohana/src/opihi/pcontrol/JobOps.c	(revision 36143)
+++ /branches/eam_branches/ipp-20130904/Ohana/src/opihi/pcontrol/JobOps.c	(revision 36144)
@@ -59,4 +59,16 @@
   pcontrol_exit (53);
   return (NULL);
+}
+
+int GetJobStackIDbyName (char *name) {
+  if (!strcasecmp (name, "ALLJOBS"))  return PCONTROL_JOB_ALLJOBS;
+  if (!strcasecmp (name, "PENDING"))  return PCONTROL_JOB_PENDING;
+  if (!strcasecmp (name, "BUSY"))     return PCONTROL_JOB_BUSY   ;
+  if (!strcasecmp (name, "RESP"))     return PCONTROL_JOB_RESP   ;
+  if (!strcasecmp (name, "DONE"))     return PCONTROL_JOB_DONE   ;
+  if (!strcasecmp (name, "KILL"))     return PCONTROL_JOB_KILL   ;
+  if (!strcasecmp (name, "EXIT"))     return PCONTROL_JOB_EXIT   ;
+  if (!strcasecmp (name, "CRASH"))    return PCONTROL_JOB_CRASH  ;
+  return (PCONTROL_JOB_NONE);
 }
 
Index: /branches/eam_branches/ipp-20130904/Ohana/src/opihi/pcontrol/jobstack.c
===================================================================
--- /branches/eam_branches/ipp-20130904/Ohana/src/opihi/pcontrol/jobstack.c	(revision 36143)
+++ /branches/eam_branches/ipp-20130904/Ohana/src/opihi/pcontrol/jobstack.c	(revision 36144)
@@ -22,5 +22,5 @@
   /* print list */
   LockStack (stack);
-  gprint (GP_LOG, "Njobs: %d\n", stack[0].Nobject);
+  gprint (GP_LOG, "BEGIN BLOCK Njobs: %d\n", stack[0].Nobject);
   for (i = 0; i < stack[0].Nobject; i++) {
     job = stack[0].object[i];
Index: /branches/eam_branches/ipp-20130904/Ohana/src/opihi/pcontrol/status.c
===================================================================
--- /branches/eam_branches/ipp-20130904/Ohana/src/opihi/pcontrol/status.c	(revision 36143)
+++ /branches/eam_branches/ipp-20130904/Ohana/src/opihi/pcontrol/status.c	(revision 36144)
@@ -1,16 +1,93 @@
 # include "pcontrol.h"
 
-int PrintJobStack (int Nstack);
+int PrintJobStack (int Nstack, char *command, char *hostname, int state, float age);
 int PrintHostStack (int Nstack);
 
 int status (int argc, char **argv) {
 
-  PrintJobStack (PCONTROL_JOB_ALLJOBS);
-  PrintHostStack (PCONTROL_HOST_ALLHOSTS);
+  int N;
+
+  if (get_argument (argc, argv, "-h")) goto usage;
+  if (get_argument (argc, argv, "-help")) goto usage;
+  if (get_argument (argc, argv, "--help")) goto usage;
+
+  /* I would like to add the following options:
+   * strsub on argv[0]
+   * strsub on hostname, realhost
+   * list hostname and realhost
+   * filter by state
+   * filter by dtime
+  */
+
+  // -cmd (cmd)
+  // -host (hostname)
+  // -state (busy, pending, done, kill, exit, crash, resp, hung
+  // -age (seconds?) (minutes?)
+  // -nohost
+
+  char *COMMAND = NULL;
+  if ((N = get_argument (argc, argv, "-cmd"))) {
+    remove_argument (N, &argc, argv);
+    COMMAND = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+
+  char *HOSTNAME = NULL;
+  if ((N = get_argument (argc, argv, "-host"))) {
+    remove_argument (N, &argc, argv);
+    HOSTNAME = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+
+  int STATE = PCONTROL_JOB_ALLJOBS;
+  if ((N = get_argument (argc, argv, "-state"))) {
+    remove_argument (N, &argc, argv);
+    STATE = GetJobStackIDbyName (argv[N]);
+    remove_argument (N, &argc, argv);
+    if (STATE == PCONTROL_JOB_NONE) goto usage;
+  }
+
+  float AGE = 0.0;
+  if ((N = get_argument (argc, argv, "-age"))) {
+    remove_argument (N, &argc, argv);
+    AGE = atof (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+
+  int SHOWHOST = TRUE;
+  if ((N = get_argument (argc, argv, "-nohost"))) {
+    remove_argument (N, &argc, argv);
+    SHOWHOST = FALSE;
+  }
+  if ((N = get_argument (argc, argv, "+jobs"))) {
+    remove_argument (N, &argc, argv);
+    SHOWHOST = FALSE;
+  }
+
+  int SHOWJOBS = TRUE;
+  if ((N = get_argument (argc, argv, "-nojobs"))) {
+    remove_argument (N, &argc, argv);
+    SHOWJOBS = FALSE;
+  }
+  if ((N = get_argument (argc, argv, "+host"))) {
+    remove_argument (N, &argc, argv);
+    SHOWJOBS = FALSE;
+  }
+
+  if (SHOWJOBS) {
+    PrintJobStack (PCONTROL_JOB_ALLJOBS, COMMAND, HOSTNAME, STATE, AGE);
+  }
+  if (SHOWHOST) {
+    PrintHostStack (PCONTROL_HOST_ALLHOSTS);
+  }
 
   return (TRUE);
+
+usage:
+  gprint (GP_ERR, "USAGE: status [-cmd command] [-host hostname] [-state state] [-age seconds] [+jobs,-nohost] [+host,-nojobs]\n");
+  return FALSE;
 }
 
-int PrintJobStack (int Nstack) {
+int PrintJobStack (int Nstack, char *command, char *hostname, int state, float age) {
 
   int i, j, Nobject;
@@ -30,10 +107,6 @@
     job = stack[0].object[i];
     ASSERT (job != NULL, "programming error");
-    if (job[0].realhost == NULL) {
-	gprint (GP_LOG, "%3d %9s ", i, job[0].hostname);
-    } else {
-	gprint (GP_LOG, "%3d %9s ", i, job[0].realhost);
-    }
-    gprint (GP_LOG, "%7s  ", GetJobStackName (job[0].state));
+
+    char *thishost = (job[0].realhost == NULL) ? job[0].hostname : job[0].realhost;
 
     switch (job[0].state) {
@@ -45,5 +118,4 @@
 	gettimeofday (&now, (void *) NULL);
 	dtime = DTIME (now, job[0].start);
-	gprint (GP_LOG, "%8.2f ", dtime);
 	break;
 
@@ -55,7 +127,29 @@
       default:
 	dtime = DTIME (job[0].stop, job[0].start);
-	gprint (GP_LOG, "%8.2f ", dtime);
 	break;
     }
+
+    // check on the filters
+    if (command) {
+      if (!strstr (job[0].argv[0], command)) continue;
+    }
+    if (hostname) {
+      if (!strstr (thishost, hostname)) continue;
+    }
+    if (age > 0.0) {
+      if (dtime < age) continue;
+    }
+    if (state != PCONTROL_JOB_ALLJOBS) {
+      // allow PCONTROL_JOB_RESP == BUSY
+      int validState = FALSE;
+      validState |= (state == PCONTROL_JOB_RESP) && (job[0].state == PCONTROL_JOB_BUSY);
+      validState |= (state == PCONTROL_JOB_BUSY) && (job[0].state == PCONTROL_JOB_RESP);
+      validState |= (state == job[0].state);
+      if (!validState) continue;
+    }
+
+    gprint (GP_LOG, "%3d %9s ", i, thishost);
+    gprint (GP_LOG, "%7s  ", GetJobStackName (job[0].state));
+    gprint (GP_LOG, "%8.2f ", dtime);
 
     PrintID (GP_LOG, job[0].JobID);
