Ver código fonte

Added monojob controller in lieu of a full working shell.

tags/v0.9.3
Michael Brown 17 anos atrás
pai
commit
6209d20779
4 arquivos alterados com 102 adições e 0 exclusões
  1. 8
    0
      src/core/job.c
  2. 78
    0
      src/core/monojob.c
  3. 1
    0
      src/include/gpxe/job.h
  4. 15
    0
      src/include/gpxe/monojob.h

+ 8
- 0
src/core/job.c Ver arquivo

@@ -34,6 +34,14 @@ void job_done ( struct job_interface *job, int rc ) {
34 34
 	job_put ( dest );
35 35
 }
36 36
 
37
+void job_kill ( struct job_interface *job ) {
38
+	struct job_interface *dest = job_get_dest ( job );
39
+
40
+	dest->op->kill ( dest );
41
+	job_unplug ( job );
42
+	job_put ( dest );
43
+}
44
+
37 45
 /****************************************************************************
38 46
  *
39 47
  * Helper methods

+ 78
- 0
src/core/monojob.c Ver arquivo

@@ -0,0 +1,78 @@
1
+/*
2
+ * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
3
+ *
4
+ * This program is free software; you can redistribute it and/or
5
+ * modify it under the terms of the GNU General Public License as
6
+ * published by the Free Software Foundation; either version 2 of the
7
+ * License, or any later version.
8
+ *
9
+ * This program is distributed in the hope that it will be useful, but
10
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12
+ * General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU General Public License
15
+ * along with this program; if not, write to the Free Software
16
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
+ */
18
+
19
+#include <errno.h>
20
+#include <gpxe/process.h>
21
+#include <console.h>
22
+#include <gpxe/keys.h>
23
+#include <gpxe/job.h>
24
+#include <gpxe/monojob.h>
25
+
26
+/** @file
27
+ *
28
+ * Single foreground job
29
+ *
30
+ */
31
+
32
+static int monojob_rc;
33
+
34
+static void monojob_done ( struct job_interface *job __unused, int rc ) {
35
+	monojob_rc = rc;
36
+}
37
+
38
+/** Single foreground job operations */
39
+static struct job_interface_operations monojob_operations = {
40
+	.done		= monojob_done,
41
+	.kill		= ignore_job_kill,
42
+	.progress	= ignore_job_progress,
43
+};
44
+
45
+/** Single foreground job */
46
+struct job_interface monojob = {
47
+	.intf = {
48
+		.dest = &null_job.intf,
49
+		.refcnt = NULL,
50
+	},
51
+	.op = &monojob_operations,
52
+};
53
+
54
+/**
55
+ * Wait for single foreground job to complete
56
+ *
57
+ * @ret rc		Job final status code
58
+ */
59
+int monojob_wait ( void ) {
60
+	int key;
61
+
62
+	monojob_rc = -EINPROGRESS;
63
+	while ( monojob_rc == -EINPROGRESS ) {
64
+		step();
65
+		if ( iskey() ) {
66
+			key = getchar();
67
+			switch ( key ) {
68
+			case CTRL_C:
69
+				job_kill ( &monojob );
70
+				return -ECANCELED;
71
+				break;
72
+			default:
73
+				break;
74
+			}
75
+		}
76
+	}
77
+	return monojob_rc;
78
+}

+ 1
- 0
src/include/gpxe/job.h Ver arquivo

@@ -65,6 +65,7 @@ extern struct job_interface null_job;
65 65
 extern struct job_interface_operations null_job_ops;
66 66
 
67 67
 extern void job_done ( struct job_interface *job, int rc );
68
+extern void job_kill ( struct job_interface *job );
68 69
 
69 70
 extern void ignore_job_done ( struct job_interface *job, int rc );
70 71
 extern void ignore_job_kill ( struct job_interface *job );

+ 15
- 0
src/include/gpxe/monojob.h Ver arquivo

@@ -0,0 +1,15 @@
1
+#ifndef _GPXE_MONOJOB_H
2
+#define _GPXE_MONOJOB_H
3
+
4
+/** @file
5
+ *
6
+ * Single foreground job
7
+ *
8
+ */
9
+
10
+struct job_interface;
11
+
12
+extern struct job_interface monojob;
13
+extern int monojob_wait ( void );
14
+
15
+#endif /* _GPXE_MONOJOB_H */

Carregando…
Cancelar
Salvar