summaryrefslogtreecommitdiffstats
path: root/sys/boot/common
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1998-10-11 10:19:11 +0000
committerpeter <peter@FreeBSD.org>1998-10-11 10:19:11 +0000
commit264893b2f7fcd5ae15479eea9c03fbb05d742a84 (patch)
tree43ac5b66cb47ed16511def37a49abad277dfc0d1 /sys/boot/common
parentf90e8eba2506baab7991db1b7476611d6674b5ac (diff)
downloadFreeBSD-src-264893b2f7fcd5ae15479eea9c03fbb05d742a84.zip
FreeBSD-src-264893b2f7fcd5ae15479eea9c03fbb05d742a84.tar.gz
Probe all consoles, not just the first. It doesn't make a lot of
difference, but might later on when we implement some sort of multi-head console mode. Select a console after probing them all. Don't strdup a potentially NULL return from getenv(). If we don't select an active console, choose the first regardless. Call the console init function, at startup time and on a manual change. The env_setenv() function needs EV_VOLATILE because it's pointing to data that isn't malloc'ed and will cause a fault if it's freed later.
Diffstat (limited to 'sys/boot/common')
-rw-r--r--sys/boot/common/console.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/sys/boot/common/console.c b/sys/boot/common/console.c
index ffc41a9..b9534d3 100644
--- a/sys/boot/common/console.c
+++ b/sys/boot/common/console.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: console.c,v 1.1.1.1 1998/08/21 03:17:41 msmith Exp $
+ * $Id: console.c,v 1.2 1998/09/26 01:29:13 msmith Exp $
*/
#include <stand.h>
@@ -51,15 +51,23 @@ cons_probe(void)
char *prefconsole;
/* Do all console probes */
- for (cons = 0, active = -1; consoles[cons] != NULL; cons++) {
+ for (cons = 0; consoles[cons] != NULL; cons++) {
consoles[cons]->c_flags = 0;
consoles[cons]->c_probe(consoles[cons]);
- if ((consoles[cons]->c_flags == (C_PRESENTIN | C_PRESENTOUT)) && (active == -1))
- active = cons; /* first candidate */
+ }
+ /* Now find the first working one */
+ active = -1;
+ for (cons = 0; consoles[cons] != NULL && active == -1; cons++) {
+ consoles[cons]->c_flags = 0;
+ consoles[cons]->c_probe(consoles[cons]);
+ if (consoles[cons]->c_flags == (C_PRESENTIN | C_PRESENTOUT))
+ active = cons;
}
/* Check to see if a console preference has already been registered */
- prefconsole = strdup(getenv("console"));
+ prefconsole = getenv("console");
+ if (prefconsole != NULL)
+ prefconsole = strdup(prefconsole);
if (prefconsole != NULL) {
unsetenv("console"); /* we want to replace this */
for (cons = 0; consoles[cons] != NULL; cons++)
@@ -69,9 +77,14 @@ cons_probe(void)
active = cons;
free(prefconsole);
}
+ if (active == -1)
+ active = 0;
consoles[active]->c_flags |= (C_ACTIVEIN | C_ACTIVEOUT);
+ consoles[active]->c_init(0);
+
printf("Console: %s\n", consoles[active]->c_desc);
- env_setenv("console", 0, consoles[active]->c_name, cons_set, env_nounset);
+ env_setenv("console", EV_VOLATILE, consoles[active]->c_name, cons_set,
+ env_nounset);
}
int
@@ -148,7 +161,8 @@ cons_set(struct env_var *ev, int flags, void *value)
/* enable selected console */
consoles[active]->c_flags |= C_ACTIVEIN | C_ACTIVEOUT;
-
+ consoles[active]->c_init(0);
+
env_setenv(ev->ev_name, flags | EV_NOHOOK, value, NULL, NULL);
return(CMD_OK);
}
OpenPOWER on IntegriCloud