Added monojob controller in lieu of a full working shell.
authorMichael Brown <mcb30@etherboot.org>
Thu, 28 Jun 2007 13:53:12 +0000 (14:53 +0100)
committerMichael Brown <mcb30@etherboot.org>
Thu, 28 Jun 2007 13:53:12 +0000 (14:53 +0100)
src/core/job.c
src/core/monojob.c [new file with mode: 0644]
src/include/gpxe/job.h
src/include/gpxe/monojob.h [new file with mode: 0644]

index 8d76858..00c0e6c 100644 (file)
@@ -34,6 +34,14 @@ void job_done ( struct job_interface *job, int rc ) {
        job_put ( dest );
 }
 
+void job_kill ( struct job_interface *job ) {
+       struct job_interface *dest = job_get_dest ( job );
+
+       dest->op->kill ( dest );
+       job_unplug ( job );
+       job_put ( dest );
+}
+
 /****************************************************************************
  *
  * Helper methods
diff --git a/src/core/monojob.c b/src/core/monojob.c
new file mode 100644 (file)
index 0000000..b4042a3
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <errno.h>
+#include <gpxe/process.h>
+#include <console.h>
+#include <gpxe/keys.h>
+#include <gpxe/job.h>
+#include <gpxe/monojob.h>
+
+/** @file
+ *
+ * Single foreground job
+ *
+ */
+
+static int monojob_rc;
+
+static void monojob_done ( struct job_interface *job __unused, int rc ) {
+       monojob_rc = rc;
+}
+
+/** Single foreground job operations */
+static struct job_interface_operations monojob_operations = {
+       .done           = monojob_done,
+       .kill           = ignore_job_kill,
+       .progress       = ignore_job_progress,
+};
+
+/** Single foreground job */
+struct job_interface monojob = {
+       .intf = {
+               .dest = &null_job.intf,
+               .refcnt = NULL,
+       },
+       .op = &monojob_operations,
+};
+
+/**
+ * Wait for single foreground job to complete
+ *
+ * @ret rc             Job final status code
+ */
+int monojob_wait ( void ) {
+       int key;
+
+       monojob_rc = -EINPROGRESS;
+       while ( monojob_rc == -EINPROGRESS ) {
+               step();
+               if ( iskey() ) {
+                       key = getchar();
+                       switch ( key ) {
+                       case CTRL_C:
+                               job_kill ( &monojob );
+                               return -ECANCELED;
+                               break;
+                       default:
+                               break;
+                       }
+               }
+       }
+       return monojob_rc;
+}
index 3190fa2..8e11aa3 100644 (file)
@@ -65,6 +65,7 @@ extern struct job_interface null_job;
 extern struct job_interface_operations null_job_ops;
 
 extern void job_done ( struct job_interface *job, int rc );
+extern void job_kill ( struct job_interface *job );
 
 extern void ignore_job_done ( struct job_interface *job, int rc );
 extern void ignore_job_kill ( struct job_interface *job );
diff --git a/src/include/gpxe/monojob.h b/src/include/gpxe/monojob.h
new file mode 100644 (file)
index 0000000..f6cebb6
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef _GPXE_MONOJOB_H
+#define _GPXE_MONOJOB_H
+
+/** @file
+ *
+ * Single foreground job
+ *
+ */
+
+struct job_interface;
+
+extern struct job_interface monojob;
+extern int monojob_wait ( void );
+
+#endif /* _GPXE_MONOJOB_H */