diff options
author | peter <peter@FreeBSD.org> | 1998-10-11 10:19:11 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 1998-10-11 10:19:11 +0000 |
commit | 264893b2f7fcd5ae15479eea9c03fbb05d742a84 (patch) | |
tree | 43ac5b66cb47ed16511def37a49abad277dfc0d1 /sys/boot/common | |
parent | f90e8eba2506baab7991db1b7476611d6674b5ac (diff) | |
download | FreeBSD-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.c | 28 |
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); } |