int useconf = 0;
char bootdevice[BOOTDEVSZ];
+char bootoncelabel[1024];
+char bootargs[1024];
char *password = NULL;
struct boot_fspec_t boot;
int _machine = _MACH_Pmac;
* config file. Handle the "\\" (blessed system folder)
*/
static int
-load_config_file(struct boot_fspec_t *orig_fspec)
+load_config_file(struct boot_fspec_t *fspec)
{
char *conf_file = NULL, *p;
struct boot_file_t file;
int sz, opened = 0, result = 0;
- char conf_path[512];
- struct boot_fspec_t fspec = *orig_fspec;
/* Allocate a buffer for the config file */
conf_file = malloc(CONFIG_FILE_MAX);
goto bail;
}
- /* Build the path to the file */
- if (_machine == _MACH_chrp)
- strcpy(conf_path, "/etc/");
- else
- conf_path[0] = 0;
- if (fspec.file && *fspec.file)
- strcat(conf_path, fspec.file);
- else
- strcat(conf_path, CONFIG_FILE_NAME);
-
/* Open it */
- fspec.file = conf_path;
- result = open_file(&fspec, &file);
+ result = open_file(fspec, &file);
if (result != FILE_ERR_OK) {
- prom_printf("%s:%d,", fspec.dev, fspec.part);
- prom_perror(result, fspec.file);
+ prom_printf("%s:%d,", fspec->dev, fspec->part);
+ prom_perror(result, fspec->file);
prom_printf("Can't open config file\n");
goto bail;
}
opened = 0;
/* Call the parsing code in cfg.c */
- if (cfg_parse(conf_path, conf_file, sz) < 0) {
+ if (cfg_parse(fspec->file, conf_file, sz) < 0) {
prom_printf ("Syntax error or read error config\n");
goto bail;
}
prom_printf("chosen=%d\n", chosen);
return 0;
}
- prom_printf("ici\n");
for (i = 0; i < ARRAY_SIZE(bootp_response_properties); i++) {
propname = bootp_response_properties[i].name;
offset = bootp_response_properties[i].offset;
break;
}
- prom_printf("ici 2\n");
if (size <= 0)
goto out;
- prom_printf("ici 3\n");
if (sizeof(*packet) > size - offset) {
prom_printf("Malformed %s property?\n", propname);
goto out;
}
- prom_printf("ici 4\n");
bootp_response = malloc(size);
if (!bootp_response)
goto out;
- prom_printf("ici 5\n");
if (prom_getprop(chosen, propname, bootp_response, size) < 0)
goto out;
- prom_printf("ici 6\n");
packet = bootp_response + offset;
sprintf(tmp, "-%02x", packet->chaddr[i]);
strcat(fspec.file, tmp);
}
- prom_printf("ici 7\n");
rc = load_config_file(&fspec);
if (rc)
int singlekey = 0;
int restricted = 0;
static int first = 1;
- static char bootargs[1024];
static char imagepath[1024];
static char initrdpath[1024];
static char sysmappath[1024];
if (first) {
first = 0;
- prom_get_chosen("bootargs", bootargs, sizeof(bootargs));
imagename = bootargs;
word_split(&imagename, ¶ms->args);
timeout = DEFAULT_TIMEOUT;
}
if (c == '\n' || c == '\r') {
- if (!imagename)
- imagename = cfg_get_default();
+ if (!imagename) {
+ if (bootoncelabel[0] != 0)
+ imagename = bootoncelabel;
+ else
+ imagename = cfg_get_default();
+ }
if (imagename)
prom_printf("%s", imagename);
if (params->args)
"If you omit \"device:\" and \"partno\" yaboot will use the values of \n"
"\"device=\" and \"partition=\" in yaboot.conf, right now those are set to: \n"
"device=%s\n"
- "partition=%d\n\n", defdevice, defpart);
+ "partition=%d\n\n"
+ "To use an alternative config file rather than /etc/yaboot.conf, type on\n"
+ " Open FirmWare Prompt: \"boot conf=device:partition,/path/to/configfile\"\n"
+ "where \"device\" and \"partition\" are defined like above.\n\n", defdevice, defpart);
+
return 0;
}
yaboot_main(void)
{
char *ptype;
+ int conf_given = 0;
+ char conf_path[1024];
if (_machine == _MACH_Pmac)
setup_display();
+ prom_get_chosen("bootargs", bootargs, sizeof(bootargs));
+ DEBUG_F("/chosen/bootargs = %s\n", bootargs);
prom_get_chosen("bootpath", bootdevice, BOOTDEVSZ);
DEBUG_F("/chosen/bootpath = %s\n", bootdevice);
+
+ /* If conf= specified on command line, it overrides
+ Usage: conf=device:partition,/path/to/conffile
+ Example: On Open Firmware Prompt, type
+ boot conf=/pci@8000000f8000000/pci@1/pci1014,028C@1/scsi@0/sd@1,0:3,/etc/yaboot.conf */
+
+ if (!strncmp(bootargs, "conf=", 5)) {
+ DEBUG_F("Using conf argument in Open Firmware\n");
+ char *end = strchr(bootargs,' ');
+ if (end)
+ *end = 0;
+
+ strcpy(bootdevice, bootargs + 5);
+ conf_given = 1;
+ DEBUG_F("Using conf=%s\n", bootdevice);
+
+ /* Remove conf=xxx from bootargs */
+ if (end)
+ memmove(bootargs, end+1, strlen(end+1)+1);
+ else
+ bootargs[0] = 0;
+ }
if (bootdevice[0] == 0) {
prom_get_options("boot-device", bootdevice, BOOTDEVSZ);
DEBUG_F("boot-device = %s\n", bootdevice);
return -1;
}
+ if (bootoncelabel[0] == 0) {
+ prom_get_options("boot-once", bootoncelabel,
+ sizeof(bootoncelabel));
+ if (bootoncelabel[0] != 0)
+ DEBUG_F("boot-once: [%s]\n", bootoncelabel);
+ }
+ prom_set_options("boot-once", NULL, 0);
+
if (!parse_device_path(bootdevice, NULL, -1, "", &boot)) {
prom_printf("%s: Unable to parse\n", bootdevice);
return -1;
DEBUG_F("After parse_device_path: dev=%s, part=%d, file=%s\n",
boot.dev, boot.part, boot.file);
- if (strlen(boot.file)) {
- if (!strncmp(boot.file, "\\\\", 2))
- boot.file = "\\\\";
- else {
- char *p, *last;
- p = last = boot.file;
- while(*p) {
- if (*p == '\\')
- last = p;
- p++;
- }
- if (p)
- *(last) = 0;
- else
- boot.file = "";
- if (strlen(boot.file))
- strcat(boot.file, "\\");
- }
+ if (!conf_given) {
+ if (_machine == _MACH_chrp)
+ boot.file = "/etc/";
+ else if (strlen(boot.file)) {
+ if (!strncmp(boot.file, "\\\\", 2))
+ boot.file = "\\\\";
+ else {
+ char *p, *last;
+ p = last = boot.file;
+ while(*p) {
+ if (*p == '\\')
+ last = p;
+ p++;
+ }
+ if (p)
+ *(last) = 0;
+ else
+ boot.file = "";
+ if (strlen(boot.file))
+ strcat(boot.file, "\\");
+ }
+ }
+ strcpy(conf_path, boot.file);
+ strcat(conf_path, CONFIG_FILE_NAME);
+ boot.file = conf_path;
+ DEBUG_F("After path kludgeup: dev=%s, part=%d, file=%s\n",
+ boot.dev, boot.part, boot.file);
}
- DEBUG_F("After pmac path kludgeup: dev=%s, part=%d, file=%s\n",
- boot.dev, boot.part, boot.file);
/*
* If we're doing a netboot, first look for one which matches our