#include <sys/types.h>
#include <sys/bootconf.h>
#include <sys/reboot.h>
#include <sys/param.h>
#include <sys/salib.h>
#include <sys/debug.h>
#include <sys/promif.h>
#include <sys/boot.h>
#include <sys/sysmacros.h>
#include <util/getoptstr.h>
#include "boot_plat.h"
static char default_path_buf[MAXPATHLEN];
char cmd_line_boot_archive[MAXPATHLEN];
boolean_t halt;
void
bootflags(char *args, size_t argsz)
{
static char newargs[OBP_MAXPATHLEN];
struct gos_params params;
const char *cp;
char *np;
size_t npres;
int c;
char *cmd_line_default_path;
cmd_line_default_path = NULL;
params.gos_opts = "HXF:VnI:D:advhko:";
params.gos_strp = args;
getoptstr_init(¶ms);
while ((c = getoptstr(¶ms)) != -1) {
switch (c) {
case 'H':
halt = B_TRUE;
case 'X':
break;
case 'F':
if (params.gos_optarglen >=
sizeof (cmd_line_boot_archive)) {
printf("boot: -F argument too long. "
"Ignoring.\n");
break;
}
(void) strncpy(cmd_line_boot_archive,
params.gos_optargp, params.gos_optarglen);
cmd_line_boot_archive[params.gos_optarglen] = '\0';
break;
case 'V':
verbosemode = 1;
break;
case 'n':
cache_state = 0;
printf("Warning: boot will not enable cache\n");
break;
case 'D':
if (params.gos_optarglen >= sizeof (default_path_buf)) {
printf("boot: -D argument too long. "
"Ignoring.\n");
break;
}
(void) strncpy(default_path_buf, params.gos_optargp,
params.gos_optarglen);
default_path_buf[params.gos_optarglen] = '\0';
cmd_line_default_path = default_path_buf;
break;
case 'a':
boothowto |= RB_ASKNAME;
break;
case 'd':
boothowto |= RB_DEBUGENTER;
break;
case 'v':
boothowto |= RB_VERBOSE;
break;
case 'h':
boothowto |= RB_HALT;
break;
case 'k':
boothowto |= RB_KMDB;
break;
case '?':
switch (params.gos_last_opt) {
case 'F':
case 'I':
case 'D':
printf("boot: -%c flag missing required "
"argument. Ignoring.\n",
params.gos_last_opt);
break;
default:
goto done;
}
break;
default:
printf("boot: Ignoring unimplemented option -%c.\n", c);
}
}
done:
*newargs = '\0';
np = newargs;
if (c == '?' || (boothowto &
(RB_ASKNAME | RB_DEBUGENTER | RB_VERBOSE | RB_HALT | RB_KMDB))) {
*np++ = '-';
if (boothowto & RB_ASKNAME)
*np++ = 'a';
if (boothowto & RB_DEBUGENTER)
*np++ = 'd';
if (boothowto & RB_KMDB)
*np++ = 'k';
if (boothowto & RB_VERBOSE)
*np++ = 'v';
if (boothowto & RB_HALT)
*np++ = 'h';
if (c == -1 && params.gos_strp[0] != '\0')
*np++ = ' ';
}
npres = sizeof (newargs) - (size_t)(np - newargs);
if (c == '?') {
cp = params.gos_errp;
while (*cp && npres > 0) {
if (cp[0] == '-' && cp[1] == '-' &&
(cp[2] == '\0' || ISSPACE(cp[2]))) {
cp += 2;
SKIP_SPC(cp);
break;
} else {
const char *sp = cp;
size_t sz;
while (*cp && !ISSPACE(*cp))
cp++;
while (ISSPACE(*cp))
cp++;
sz = MIN(npres, (size_t)(cp - sp));
npres -= sz;
bcopy(sp, np, sz);
np += sz;
}
}
} else {
cp = params.gos_strp;
}
while (npres > 0 && (*np++ = *cp++) != '\0')
npres--;
newargs[sizeof (newargs) - 1] = '\0';
(void) strlcpy(args, newargs, argsz);
if (cmd_line_default_path)
set_default_filename(cmd_line_default_path);
if (halt == B_TRUE)
prom_enter_mon();
}