struct bootp_packet *packet;
int rc = 0;
struct boot_fspec_t fspec = *orig_fspec;
-#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
+ char *cfgpath = (_machine == _MACH_chrp) ? "/etc/" : "";
+ int flen;
+ int minlen;
packet = prom_get_netinfo();
if (!fspec.file)
goto out;
- if (_machine == _MACH_chrp)
- sprintf(fspec.file, "/etc/%02x-", packet->htype);
- else
- sprintf(fspec.file, "%02x-", packet->htype);
+ sprintf(fspec.file, "%s%02x-", cfgpath, packet->htype);
strcat(fspec.file, prom_get_mac(packet));
rc = load_config_file(&fspec);
if (rc)
goto out;
-
/*
* Now try to match on IP.
*/
- free(fspec.file);
- /* 8 chars in yiaddr + \0 */
- fspec.file = malloc(9);
- if (!fspec.file)
- goto out;
-
- strcpy(fspec.file, "/etc/");
- strcat(fspec.file, prom_get_ip(packet));
+ /* no need to realloc for /etc/ + 8 chars in yiaddr + \0 */
+ sprintf(fspec.file, "%s%s", cfgpath, prom_get_ip(packet));
- while (strlen(strrchr(fspec.file, '/')+1)) {
+ for (flen = strlen(fspec.file),
+ minlen = strlen(cfgpath); flen > minlen; flen--) {
rc = load_config_file(&fspec);
if (rc)
goto out;
/* Chop one digit off the end, try again */
- fspec.file[strlen(fspec.file) - 1] = '\0';
+ fspec.file[flen - 1] = '\0';
}
out:
Elf32_Ehdr *e = &(loadinfo->elf.elf32hdr);
Elf32_Phdr *p, *ph;
int size = sizeof(Elf32_Ehdr) - sizeof(Elf_Ident);
- unsigned long addr, loadaddr;
+ unsigned long loadaddr;
/* Read the rest of the Elf header... */
if ((*(file->fs->read))(file, size, &e->e_version) < size) {
loadaddr = loadinfo->load_loc;
}
- /* On some systems, loadaddr may already be claimed, so try some
- * other nearby addresses before giving up.
- */
- for(addr=loadaddr; addr <= loadaddr * 8 ;addr+=0x100000) {
- loadinfo->base = prom_claim((void *)addr, loadinfo->memsize, 0);
- if (loadinfo->base != (void *)-1) break;
- }
+ loadinfo->base = prom_claim_chunk((void *)loadaddr, loadinfo->memsize, 0);
if (loadinfo->base == (void *)-1) {
prom_printf("Claim error, can't allocate kernel memory\n");
goto bail;
Elf64_Ehdr *e = &(loadinfo->elf.elf64hdr);
Elf64_Phdr *p, *ph;
int size = sizeof(Elf64_Ehdr) - sizeof(Elf_Ident);
- unsigned long addr, loadaddr;
+ unsigned long loadaddr;
/* Read the rest of the Elf header... */
if ((*(file->fs->read))(file, size, &e->e_version) < size) {
loadaddr = e->e_entry;
}
- /* On some systems, loadaddr may already be claimed, so try some
- * other nearby addresses before giving up.
- */
- for(addr=loadaddr; addr <= loadaddr * 8 ;addr+=0x100000) {
- loadinfo->base = prom_claim((void *)addr, loadinfo->memsize, 0);
- if (loadinfo->base != (void *)-1) break;
- }
+ loadinfo->base = prom_claim_chunk((void *)loadaddr, loadinfo->memsize, 0);
if (loadinfo->base == (void *)-1) {
prom_printf("Claim error, can't allocate kernel memory\n");
goto bail;
}
if (scrn == PROM_INVALID_HANDLE) {
- prom_printf("No screen device found !/n");
+ prom_printf("No screen device found !\n");
return;
}
for(i=0;i<16;i++) {