/*
* Copyright (c) 1996, 1997
* Matthias Drochner. All rights reserved.
* Copyright (c) 1996, 1997
* Perry E. Metzger. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgements:
* This product includes software developed for the NetBSD Project
* by Matthias Drochner.
* This product includes software developed for the NetBSD Project
* by Perry E. Metzger.
* 4. The names of the authors may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
int
parsebootfile(const char *fname, char **fsmode, char **devname, int *unit, int *partition, const char **file)
/* fsmode: out */
/* devname: out */
/* unit, *partition: out */
/* file: out */
{
const char *col, *help;
if (strcmp(current_fsmode, "dos") && (col = strchr(fname, ':'))) {
/* no DOS, device given */
static char savedevname[MAXDEVNAME + 1];
int devlen;
unsigned int u = 0, p = 0;
int i = 0;
devlen = col - fname;
if (devlen > MAXDEVNAME)
return (EINVAL);
#define isvalidname(c) ((c) >= 'a' && (c) <= 'z')
if (!isvalidname(fname[i]))
return (EINVAL);
do {
savedevname[i] = fname[i];
i++;
} while (isvalidname(fname[i]));
savedevname[i] = '\0';
#define isnum(c) ((c) >= '0' && (c) <= '9')
if (i < devlen) {
if (!isnum(fname[i]))
return (EUNIT);
do {
u *= 10;
u += fname[i++] - '0';
} while (isnum(fname[i]));
}
#define isvalidpart(c) ((c) >= 'a' && (c) <= 'z')
if (i < devlen) {
if (!isvalidpart(fname[i]))
return (EPART);
p = fname[i++] - 'a';
}
if (i != devlen)
return (ENXIO);
*devname = savedevname;
*unit = u;
*partition = p;
help = col + 1;
} else
help = fname;
if (*help)
*file = help;
return (0);
}
char *
sprint_bootsel(const char *filename)
{
char *fsname, *devname;
int unit, partition;
const char *file;
static char buf[80];
if (parsebootfile(filename, &fsname, &devname, &unit,
&partition, &file) == 0) {
if (!strcmp(fsname, "dos"))
snprintf(buf, sizeof(buf), "dos:%s", file);
else if (!strcmp(fsname, "ufs"))
snprintf(buf, sizeof(buf), "%s%d%c:%s", devname, unit,
'a' + partition, file);
else goto bad;
return (buf);
}
bad:
return ("(invalid)");
}
static void
bootit(const char *filename, int howto, int tell)
{
int floppy = strncmp(default_devname, "fd", 2) == 0;
if (tell) {
printf("booting %s", sprint_bootsel(filename));
if (howto)
printf(" (howto 0x%x)", howto);
printf("\n");
}
if (exec_netbsd(filename, 0, howto, floppy, NULL) < 0)
printf("boot: %s: %s\n", sprint_bootsel(filename),
strerror(errno));
else
printf("boot returned\n");
}
static void
print_banner(void)
{
int extmem = getextmem();