diff options
author | Michal Soltys <soltys@ziu.info> | 2013-02-14 16:51:46 +0100 |
---|---|---|
committer | Michal Soltys <soltys@ziu.info> | 2013-02-14 16:53:05 +0100 |
commit | 907de25858cbfad5807a127fe815ff075b6e4ab3 (patch) | |
tree | 74ed26d4c0977b614532ccc1b9f70cdf11f28f9d | |
parent | d7c0b9740859eb9051582a260755d8cc20e7c995 (diff) | |
download | syslinux-907de25858cbfad5807a127fe815ff075b6e4ab3.tar.gz syslinux-907de25858cbfad5807a127fe815ff075b6e4ab3.tar.xz syslinux-907de25858cbfad5807a127fe815ff075b6e4ab3.zip |
com32/chain: warning/error/help/doc tidying
Trivial change that tidies a bit warning / error reporting through
fatal()/error()/warn(). Also small doc/help updates.
Signed-off-by: Michal Soltys <soltys@ziu.info>
-rw-r--r-- | com32/chain/chain.c | 60 | ||||
-rw-r--r-- | com32/chain/mangle.c | 30 | ||||
-rw-r--r-- | com32/chain/options.c | 137 | ||||
-rw-r--r-- | com32/chain/partiter.c | 50 | ||||
-rw-r--r-- | com32/chain/utility.h | 17 | ||||
-rw-r--r-- | doc/chain.txt | 21 |
6 files changed, 166 insertions, 149 deletions
diff --git a/com32/chain/chain.c b/com32/chain/chain.c index 85ec723c..ccfeefa3 100644 --- a/com32/chain/chain.c +++ b/com32/chain/chain.c @@ -168,7 +168,7 @@ static void do_boot(struct data_area *data, int ndata) mmap = syslinux_memory_map(); if (!mmap) { - error("Cannot read system memory map\n"); + error("Cannot read system memory map."); return; } @@ -269,17 +269,17 @@ static void do_boot(struct data_area *data, int ndata) /* Force text mode */ syslinux_force_text_mode(); - fputs("Booting...\n", stdout); + puts("Booting..."); syslinux_shuffle_boot_rm(mlist, mmap, opt.keeppxe, &opt.regs); - error("Chainboot failed!\n"); + error("Chainboot failed !"); return; too_big: - error("Loader file too large\n"); + error("Loader file too large."); return; enomem: - error("Out of memory\n"); + error("Out of memory."); return; } @@ -296,23 +296,23 @@ int find_dp(struct part_iter **_iter) if (!strncmp(opt.drivename, "mbr", 3)) { if (find_by_sig(strtoul(opt.drivename + 4, NULL, 0), &iter) < 0) { - error("Unable to find requested MBR signature.\n"); + error("Unable to find requested MBR signature."); goto bail; } } else if (!strncmp(opt.drivename, "guid", 4)) { if (str_to_guid(opt.drivename + 5, &gpt_guid)) goto bail; if (find_by_guid(&gpt_guid, &iter) < 0) { - error("Unable to find requested GPT disk or partition by guid.\n"); + error("Unable to find requested GPT disk or partition by guid."); goto bail; } } else if (!strncmp(opt.drivename, "label", 5)) { if (!opt.drivename[6]) { - error("No label specified.\n"); + error("No label specified."); goto bail; } if (find_by_label(opt.drivename + 6, &iter) < 0) { - error("Unable to find requested GPT partition by label.\n"); + error("Unable to find requested GPT partition by label."); goto bail; } } else if ((opt.drivename[0] == 'h' || opt.drivename[0] == 'f') && @@ -330,7 +330,7 @@ int find_dp(struct part_iter **_iter) } else if (!strcmp(opt.drivename, "boot") || !strcmp(opt.drivename, "fs")) { if (!is_phys(sdi->c.filesystem)) { error("When syslinux is not booted from physical disk (or its emulation),\n" - "'boot' and 'fs' are meaningless.\n"); + "'boot' and 'fs' are meaningless."); goto bail; } /* offsets match, but in case it changes in the future */ @@ -355,12 +355,12 @@ int find_dp(struct part_iter **_iter) } /* broken part structure or other problems */ if (iter->status) { - error("Can't find myself on the drive I booted from.\n"); + error("Can't find myself on the drive I booted from."); goto bail; } } } else { - error("Unparsable drive specification.\n"); + error("Unparsable drive specification."); goto bail; } /* main options done - only thing left is explicit partition specification, @@ -375,13 +375,13 @@ int find_dp(struct part_iter **_iter) break; } while (!pi_next(iter)); if (iter->status) { - error("Requested disk / partition combination not found.\n"); + error("Requested disk / partition combination not found."); goto bail; } } if (!(iter->di.disk & 0x80) && iter->index) { - error("WARNING: Partitions on floppy devices may not work.\n"); + warn("Partitions on floppy devices may not work."); } *_iter = iter; @@ -408,7 +408,7 @@ static int setup_handover(const struct part_iter *iter, /* RAW handover protocol */ ha = malloc(synth_size); if (!ha) { - error("Could not build RAW hand-over record!\n"); + critm(); goto bail; } len = ~0u; @@ -426,7 +426,7 @@ static int setup_handover(const struct part_iter *iter, synth_size += sizeof *plen + iter->gpt.pe_size; ha = malloc(synth_size); if (!ha) { - error("Could not build GPT hand-over record!\n"); + critm(); goto bail; } lba2chs(&ha->start, &iter->di, iter->start_lba, L2C_CADD); @@ -456,7 +456,7 @@ static int setup_handover(const struct part_iter *iter, /* MBR handover protocol */ ha = malloc(synth_size); if (!ha) { - error("Could not build MBR hand-over record!\n"); + critm(); goto bail; } memcpy(ha, iter->record, synth_size); @@ -528,11 +528,11 @@ int main(int argc, char *argv[]) fdat.base = (opt.fseg << 4) + opt.foff; if (loadfile(opt.file, &fdat.data, &fdat.size)) { - error("Couldn't read the boot file.\n"); + error("Couldn't read the boot file."); goto bail; } if (fdat.base + fdat.size - 1 > ADDRMAX) { - error("The boot file is too big to load at this address.\n"); + error("The boot file is too big to load at this address."); goto bail; } } @@ -543,22 +543,22 @@ int main(int argc, char *argv[]) sdat.size = iter->di.bps; if (sdat.base + sdat.size - 1 > ADDRMAX) { - error("The sector cannot be loaded at such high address.\n"); + error("The sector cannot be loaded at such high address."); goto bail; } if (!(sdat.data = disk_read_sectors(&iter->di, iter->start_lba, 1))) { - error("Couldn't read the sector.\n"); + error("Couldn't read the sector."); goto bail; } if (opt.save) { if (!(sbck = malloc(sdat.size))) { - error("Couldn't allocate cmp-buf for option 'save'.\n"); + critm(); goto bail; } memcpy(sbck, sdat.data, sdat.size); } if (opt.file && opt.maps && overlap(&fdat, &sdat)) { - error("WARNING: The sector won't be mmapped, as it would conflict with the boot file.\n"); + warn("The sector won't be mmapped, as it would conflict with the boot file."); opt.maps = false; } } @@ -570,8 +570,8 @@ int main(int argc, char *argv[]) /* Verify possible conflicts */ if ( ( opt.file && overlap(&fdat, &hdat)) || ( opt.maps && overlap(&sdat, &hdat)) ) { - error("WARNING: Handover area won't be prepared,\n" - "as it would conflict with the boot file and/or the sector.\n"); + warn("Handover area won't be prepared,\n" + "as it would conflict with the boot file and/or the sector."); opt.hand = false; } } @@ -622,15 +622,15 @@ int main(int argc, char *argv[]) memcpy(data + ndata++, &hdat, sizeof(hdat)); #ifdef DEBUG - printf("iter->di dsk, bps: %X, %u\niter->di lbacnt, C*H*S: %"PRIu64", %u\n" + dprintf("iter->di dsk, bps: %X, %u\niter->di lbacnt, C*H*S: %"PRIu64", %u\n" "iter->di C, H, S: %u, %u, %u\n", iter->di.disk, iter->di.bps, iter->di.lbacnt, iter->di.cyl * iter->di.head * iter->di.spt, iter->di.cyl, iter->di.head, iter->di.spt); - printf("iter idx: %d\n", iter->index); - printf("iter lba: %"PRIu64"\n", iter->start_lba); + dprintf("iter idx: %d\n", iter->index); + dprintf("iter lba: %"PRIu64"\n", iter->start_lba); if (opt.hand) - printf("hand lba: %u\n", + dprintf("hand lba: %u\n", ((struct disk_dos_part_entry *)hdat.data)->start_lba); #endif @@ -642,7 +642,7 @@ int main(int argc, char *argv[]) if (ndata && !opt.brkchain) /* boot only if we actually chainload */ do_boot(data, ndata); else - error("Service-only run completed, exiting.\n"); + puts("Service-only run completed, exiting."); bail: pi_del(&iter); /* Free allocated areas */ diff --git a/com32/chain/mangle.c b/com32/chain/mangle.c index a699f3ca..b252a66c 100644 --- a/com32/chain/mangle.c +++ b/com32/chain/mangle.c @@ -62,7 +62,7 @@ int manglef_isolinux(struct data_area *data) sdi = syslinux_derivative_info(); if (sdi->c.filesystem != SYSLINUX_FS_ISOLINUX) { - error ("The isolinux= option is only valid when run from ISOLINUX.\n"); + error("The isolinux= option is only valid when run from ISOLINUX."); goto bail; } @@ -88,7 +88,7 @@ int manglef_isolinux(struct data_area *data) file_lba = get_file_lba(opt.file); if (file_lba == 0) { - error("Failed to find LBA offset of the boot file\n"); + error("Failed to find LBA offset of the boot file."); goto bail; } /* Set it */ @@ -163,7 +163,7 @@ int manglef_grub(const struct part_iter *iter, struct data_area *data) return 0; if (data->size < sizeof(struct grub_stage2_patch_area)) { - error("The file specified by grub=<loader> is too small to be stage2 of GRUB Legacy.\n"); + error("The file specified by grub=<loader> is too small to be stage2 of GRUB Legacy."); goto bail; } stage2 = data->data; @@ -174,7 +174,7 @@ int manglef_grub(const struct part_iter *iter, struct data_area *data) */ if (stage2->compat_version_major != 3 || stage2->compat_version_minor != 2) { - error("The file specified by grub=<loader> is not a supported stage2 GRUB Legacy binary.\n"); + error("The file specified by grub=<loader> is not a supported stage2 GRUB Legacy binary."); goto bail; } @@ -213,7 +213,7 @@ int manglef_grub(const struct part_iter *iter, struct data_area *data) */ if (opt.grubcfg) { if (strlen(opt.grubcfg) > sizeof(stage2->config_file) - 1) { - error ("The config filename length can't exceed 88 characters.\n"); + error("The config filename length can't exceed 88 characters."); goto bail; } @@ -254,11 +254,11 @@ int manglef_drmk(struct data_area *data) dprintf(" fs_lba offset is %d\n", fs_lba); /* DRMK only uses a DWORD */ if (fs_lba > 0xffffffff) { - error("LBA very large; Only using lower 32 bits; DRMK will probably fail\n"); + error("LBA very large; Only using lower 32 bits; DRMK will probably fail."); } opt.regs.ss = opt.regs.fs = opt.regs.gs = 0; /* Used before initialized */ if (!realloc(data->data, tsize)) { - error("Failed to realloc for DRMK.\n"); + error("Failed to realloc for DRMK."); goto bail; } data->size = tsize; @@ -352,12 +352,12 @@ int manglesf_bss(struct data_area *sec, struct data_area *fil) type2 = bpb_detect(sec->data, "bss/sect"); if (!type1 || !type2) { - error("Couldn't determine the BPB type for option 'bss'.\n"); + error("Couldn't determine the BPB type for option 'bss'."); goto bail; } if (type1 != type2) { error("Option 'bss' can't be used,\n" - "when a sector and a file have incompatible BPBs.\n"); + "when a sector and a file have incompatible BPBs."); goto bail; } @@ -395,7 +395,7 @@ int mangles_save(const struct part_iter *iter, const struct data_area *data, voi if (memcmp(org, data->data, data->size)) { if (disk_write_sectors(&iter->di, iter->start_lba, data->data, 1)) { - error("Cannot write the updated sector.\n"); + error("Cannot write the updated sector."); goto bail; } /* function can be called again */ @@ -530,12 +530,12 @@ int manglepe_hide(struct part_iter *miter) return 0; if (miter->type != typedos) { - error("Option '[un]hide[all]' is meaningful only for legacy (DOS) partition scheme.\n"); + error("Option '[un]hide[all]' works only for legacy (DOS) partition scheme."); return -1; } if (miter->index > 4 && !(opt.hide & HIDE_EXT)) - error("WARNING: your partition is logical, so it can't be unhidden without 'unhideall'.\n"); + warn("Specified partition is logical, so it can't be unhidden without 'unhideall'."); if (!(iter = pi_begin(&miter->di, PIF_STEPALL))) return -1; @@ -569,7 +569,7 @@ int manglepe_hide(struct part_iter *miter) werr |= disk_write_sectors(&iter->di, iter->dos.cebr_lba, iter->data, 1); } if (werr) - error("WARNING: failed to write E/MBR during '[un]hide[all]'\n"); + warn("Failed to write E/MBR during '[un]hide[all]'."); bail: pi_del(&iter); @@ -607,7 +607,7 @@ int manglepe_fixchs(struct part_iter *miter) return 0; if (miter->type != typedos) { - error("Option 'fixchs' is meaningful only for legacy (DOS) partition scheme.\n"); + error("Option 'fixchs' works only for legacy (DOS) partition scheme."); return -1; } @@ -642,7 +642,7 @@ int manglepe_fixchs(struct part_iter *miter) werr |= disk_write_sectors(&iter->di, iter->dos.cebr_lba, iter->data, 1); } if (werr) - error("WARNING: failed to write E/MBR during 'fixchs'\n"); + warn("Failed to write E/MBR during 'fixchs'."); bail: pi_del(&iter); diff --git a/com32/chain/options.c b/com32/chain/options.c index 46a26df2..93f14f7a 100644 --- a/com32/chain/options.c +++ b/com32/chain/options.c @@ -58,14 +58,14 @@ static int soi_s2n(char *ptr, unsigned int *seg, val = (segval << 4) + offval; if (val < ADDRMIN || val > ADDRMAX) { - error("Invalid seg:off:* address specified..\n"); + error("Invalid seg:off:* address specified."); goto bail; } val = (segval << 4) + ipval; if (ipval > 0xFFFE || val < ADDRMIN || val > ADDRMAX) { - error("Invalid seg:*:ip address specified.\n"); + error("Invalid seg:*:ip address specified."); goto bail; } @@ -83,69 +83,74 @@ bail: static void usage(void) { - unsigned int i; - static const char key[] = "Press any key...\n"; + size_t i; static const char *const usage[] = { -"\ -Usage:\n\ - chain.c32 [options]\n\ - chain.c32 {fd|hd}<disk#>{,| }[<part#>] [options]\n\ - chain.c32 mbr{:|=}<id>{,| }[<part#>] [options]\n\ - chain.c32 guid{:|=}<guid>{,| }[<part#>] [options]\n\ - chain.c32 label{:|=}<label> [<part#>] [options]\n\ - chain.c32 boot{,| }[<part#>] [options]\n\ - chain.c32 fs [options]\n\ -", "\ -\nOptions ('no' prefix specifies default value):\n\ - sect[=<s[:o[:i]]>] Load sector at <s:o>, jump to <s:i>\n\ - - defaults to 0:0x7C00:0x7C00\n\ - - ommited o/i values default to 0\n\ - maps Map loaded sector into real memory\n\ - nosetbpb Fix BPB fields in loaded sector\n\ - nofilebpb Apply 'setbpb' to loaded file\n\ - nosave Write adjusted sector back to disk\n\ - hand Prepare handover area\n\ - nohptr Force ds:si and ds:bp to point to handover area\n\ - noswap Swap drive numbers, if bootdisk is not fd0/hd0\n\ - nohide Disable all hide variations (also the default)\n\ - hide Hide primary partitions, unhide selected partition\n\ - hideall Hide *all* partitions, unhide selected partition\n\ - unhide Unhide primary partitions\n\ - unhideall Unhide *all* partitions\n\ - nofixchs Walk *all* partitions and fix E/MBRs' chs values\n\ - nokeeppxe Keep the PXE and UNDI stacks in memory (PXELINUX)\n\ - nowarn Wait for a keypress to continue chainloading\n\ - - useful to see emited warnings\n\ - nobreak Actually perform the chainloading\n\ -", "\ -\nOptions continued ...\n\ - file=<file> Load and execute <file>\n\ - seg=<s[:o[:i]]> Load file at <s:o>, jump to <s:i>\n\ - - defaults to 0:0x7C00:0x7C00\n\ - - ommited o/i values default to 0\n\ - isolinux=<loader> Load another version of ISOLINUX\n\ - ntldr=<loader> Load Windows NTLDR, SETUPLDR.BIN or BOOTMGR\n\ - reactos=<loader> Load ReactOS's loader\n\ - cmldr=<loader> Load Recovery Console of Windows NT/2K/XP/2003\n\ - freedos=<loader> Load FreeDOS KERNEL.SYS\n\ - msdos=<loader> Load MS-DOS 2.xx - 6.xx IO.SYS\n\ - msdos7=<loader> Load MS-DOS 7+ IO.SYS\n\ - pcdos=<loader> Load PC-DOS IBMBIO.COM\n\ - drmk=<loader> Load DRMK DELLBIO.BIN\n\ - grub=<loader> Load GRUB Legacy stage2\n\ - grubcfg=<filename> Set alternative config filename for GRUB Legacy\n\ - grldr=<loader> Load GRUB4DOS grldr\n\ - bss=<filename> Emulate syslinux's BSS\n\ - bs=<filename> Emulate syslinux's BS\n\ -\nPlease see doc/chain.txt for the detailed documentation.\n\ -" - }; +"Usage:", +"", +" disk + partition selection:", +" chain.c32 [options]", +" chain.c32 hd#[,#] [options]", +" chain.c32 fd#[,#] [options]", +" chain.c32 mbr=<id>[,#] [options]", +" chain.c32 guid=<guid>[,#] [options]", +" chain.c32 boot[,#] [options]", +"", +" direct partition selection:", +" chain.c32 guid=<guid> [options]", +" chain.c32 label=<label> [options]", +" chain.c32 fs [options]", +"", +"You can use ':' instead of '=' and ' ' instead of ','.", +"The default is 'boot,0'.", +"", +"Options:", +" sect[=<s[:o[:i]]>] Load sector at <s:o>, jump to <s:i>", +" - defaults to 0:0x7C00:0x7C00", +" - omitted o/i values default to 0", +" maps Map loaded sector into real memory", +" setbpb Fix BPB fields in loaded sector", +" filebpb Apply 'setbpb' to loaded file", +" save Write adjusted sector back to disk", +" hand Prepare handover area", +" hptr Force ds:si and ds:bp to point to handover area", +" swap Swap drive numbers, if bootdisk is not fd0/hd0", +" nohide Disable all hide variations (default)", +" hide Hide primary partitions, unhide selected partition", +" hideall Hide *all* partitions, unhide selected partition", +" unhide Unhide primary partitions", +" unhideall Unhide *all* partitions", +" fixchs Walk *all* partitions and fix E/MBRs' CHS values", +" keeppxe Keep the PXE and UNDI stacks in memory (PXELINUX)", +" warn Wait for a keypress to continue chainloading", +" break Don't chainload", +"", +" file=<file> Load and execute <file>", +" seg=<s[:o[:i]]> Load file at <s:o>, jump to <s:i>", +" - defaults to 0:0x7C00:0x7C00", +" - omitted o/i values default to 0", +" isolinux=<loader> Load another version of ISOLINUX", +" ntldr=<loader> Load Windows NTLDR, SETUPLDR.BIN or BOOTMGR", +" reactos=<loader> Load ReactOS's loader", +" cmldr=<loader> Load Recovery Console of Windows NT/2K/XP/2003", +" freedos=<loader> Load FreeDOS KERNEL.SYS", +" msdos=<loader> Load MS-DOS 2.xx - 6.xx IO.SYS", +" msdos7=<loader> Load MS-DOS 7+ IO.SYS", +" pcdos=<loader> Load PC-DOS IBMBIO.COM", +" drmk=<loader> Load DRMK DELLBIO.BIN", +" grub=<loader> Load GRUB Legacy stage2", +" grubcfg=<config> Set alternative config filename for GRUB Legacy", +" grldr=<loader> Load GRUB4DOS grldr", +" bss=<sectimage> Emulate syslinux's BSS", +" bs=<sectimage> Emulate syslinux's BS", +"", +"Please see doc/chain.txt for the detailed documentation." +}; for (i = 0; i < sizeof(usage)/sizeof(usage[0]); i++) { - if (i) { - error(key); + if (i % 20 == 19) { + puts("Press any key..."); wait_key(); } - error(usage[i]); + puts(usage[i]); } } @@ -360,27 +365,27 @@ int opt_parse_args(int argc, char *argv[]) } if (opt.grubcfg && !opt.grub) { - error("grubcfg=<filename> must be used together with grub=<loader>.\n"); + error("grubcfg=<filename> must be used together with grub=<loader>."); goto bail; } if (opt.filebpb && !opt.file) { - error("Option 'filebpb' requires a file.\n"); + error("Option 'filebpb' requires a file."); goto bail; } if (opt.save && !opt.sect) { - error("Option 'save' requires a sector.\n"); + error("Option 'save' requires a sector."); goto bail; } if (opt.setbpb && !opt.sect) { - error("Option 'setbpb' requires a sector.\n"); + error("Option 'setbpb' requires a sector."); goto bail; } if (opt.maps && !opt.sect) { - error("Option 'maps' requires a sector.\n"); + error("Option 'maps' requires a sector."); goto bail; } diff --git a/com32/chain/partiter.c b/com32/chain/partiter.c index 7f98ecb2..65357193 100644 --- a/com32/chain/partiter.c +++ b/com32/chain/partiter.c @@ -103,8 +103,10 @@ static int pi_dos_ctor(struct part_iter *iter, if (pi_ctor(iter, di, flags)) return -1; - if (!(iter->data = malloc(sizeof(struct disk_dos_mbr)))) + if (!(iter->data = malloc(sizeof(struct disk_dos_mbr)))) { + critm(); goto bail; + } memcpy(iter->data, mbr, sizeof(struct disk_dos_mbr)); @@ -131,8 +133,10 @@ static int pi_gpt_ctor(struct part_iter *iter, siz = (uint64_t)gpth->part_count * gpth->part_size; - if (!(iter->data = malloc((size_t)siz))) + if (!(iter->data = malloc((size_t)siz))) { + critm(); goto bail; + } memcpy(iter->data, gptl, (size_t)siz); @@ -169,7 +173,7 @@ static int notsane_logical(const struct part_iter *iter) return 0; if (ost_is_ext(dp[0].ostype)) { - error("1st EBR entry must be data or empty.\n"); + error("The 1st EBR entry must be data or empty."); return -1; } @@ -180,7 +184,7 @@ static int notsane_logical(const struct part_iter *iter) !sane(dp[0].start_lba, dp[0].length) || end_log > iter->dos.nebr_siz) { - error("Logical partition (in EBR) with invalid offset and/or length.\n"); + error("Logical partition (in EBR) with invalid offset and/or length."); return -1; } @@ -205,7 +209,7 @@ static int notsane_extended(const struct part_iter *iter) return 0; if (!ost_is_nondata(dp[1].ostype)) { - error("The 2nd EBR entry must be extended or empty.\n"); + error("The 2nd EBR entry must be extended or empty."); return -1; } @@ -216,7 +220,7 @@ static int notsane_extended(const struct part_iter *iter) !sane(dp[1].start_lba, dp[1].length) || end_ebr > iter->dos.bebr_siz) { - error("Extended partition (EBR) with invalid offset and/or length.\n"); + error("Extended partition (EBR) with invalid offset and/or length."); return -1; } @@ -240,7 +244,7 @@ static int notsane_primary(const struct part_iter *iter) !dp->length || !sane(dp->start_lba, dp->length) || dp->start_lba + dp->length > iter->di.lbacnt) { - error("Primary partition (in MBR) with invalid offset and/or length.\n"); + error("Primary partition (in MBR) with invalid offset and/or length."); return -1; } @@ -258,7 +262,7 @@ static int notsane_gpt(const struct part_iter *iter) if (gp->lba_first < iter->gpt.ufirst || gp->lba_last > iter->gpt.ulast) { - error("LBA sectors of GPT partition are beyond the range allowed in GPT header.\n"); + error("LBA sectors of GPT partition are beyond the range allowed in GPT header."); return -1; } @@ -280,7 +284,7 @@ static int dos_next_mbr(struct part_iter *iter, uint32_t *lba, if (ost_is_ext(dp->ostype)) { if (iter->dos.bebr_index0 >= 0) { - error("More than 1 extended partition.\n"); + error("More than 1 extended partition."); iter->status = PI_INSANE; return -1; } @@ -331,7 +335,7 @@ static int dos_next_ebr(struct part_iter *iter, uint32_t *lba, free(iter->data); if (!(iter->data = disk_read_sectors(&iter->di, iter->dos.nebr_lba, 1))) { - error("Couldn't load EBR.\n"); + error("Couldn't load EBR."); iter->status = PI_ERRLOAD; return -1; } @@ -405,18 +409,18 @@ static int gpt_check_hdr_crc(const struct disk_info * const diskinfo, struct dis hold_crc32 = gh->chksum; gh->chksum = 0; if (!valid_crc(hold_crc32, (const uint8_t *)gh, gh->hdr_size)) { - error("WARNING: Primary GPT header checksum invalid.\n"); + warn("Primary GPT header checksum invalid."); /* retry with backup */ lba_alt = gh->lba_alt; free(gh); if (!(gh = *_gh = disk_read_sectors(diskinfo, lba_alt, 1))) { - error("Couldn't read backup GPT header.\n"); + error("Couldn't read backup GPT header."); return -1; } hold_crc32 = gh->chksum; gh->chksum = 0; if (!valid_crc(hold_crc32, (const uint8_t *)gh, gh->hdr_size)) { - error("Secondary GPT header checksum invalid.\n"); + error("Secondary GPT header checksum invalid."); return -1; } } @@ -514,7 +518,7 @@ static struct part_iter *pi_alloc(void) { struct part_iter *iter; if (!(iter = malloc(sizeof(struct part_iter)))) - error("Couldn't allocate memory for the iterator.\n"); + critm(); else memset(iter, 0, sizeof(struct part_iter)); return iter; @@ -545,13 +549,13 @@ struct part_iter *pi_begin(const struct disk_info *di, int flags) /* Read MBR */ if (!(mbr = disk_read_sectors(di, 0, 1))) { - error("Couldn't read first disk sector.\n"); + error("Couldn't read the first disk sector."); goto bail; } /* Check for MBR magic */ if (mbr->sig != disk_mbr_sig_magic) { - error("WARNING: no MBR magic, treating disk as raw.\n"); + warn("No MBR magic, treating disk as raw."); /* looks like RAW */ ret = pi_ctor(iter, di, flags); goto bail; @@ -560,7 +564,7 @@ struct part_iter *pi_begin(const struct disk_info *di, int flags) /* Check for GPT protective MBR */ if (mbr->table[0].ostype == 0xEE) { if (!(gpth = disk_read_sectors(di, 1, 1))) { - error("Couldn't read potential GPT header.\n"); + error("Couldn't read potential GPT header."); goto bail; } } @@ -572,7 +576,7 @@ struct part_iter *pi_begin(const struct disk_info *di, int flags) uint64_t gpt_lsiz; /* size of GPT partition list in bytes */ uint64_t gpt_lcnt; /* size of GPT partition in sectors */ #ifdef DEBUG - puts("Looks like a GPT v1.0 disk."); + dprintf("Looks like a GPT v1.0 disk.\n"); disk_gpt_header_dump(gpth); #endif /* Verify checksum, fallback to backup, then bail if invalid */ @@ -596,24 +600,24 @@ struct part_iter *pi_begin(const struct disk_info *di, int flags) gpth->lba_last_usable + gpt_lcnt >= gpth->lba_alt || gpth->lba_alt >= di->lbacnt || gpth->part_size < sizeof(struct disk_gpt_part_entry)) { - error("Invalid GPT header's values.\n"); + error("Invalid GPT header's values."); goto bail; } if (!(gptl = disk_read_sectors(di, gpt_loff, gpt_lcnt))) { - error("Couldn't read GPT partition list.\n"); + error("Couldn't read GPT partition list."); goto bail; } /* Check array checksum(s). */ if (!valid_crc(gpth->table_chksum, (const uint8_t *)gptl, (unsigned int)gpt_lsiz)) { - error("Checksum of the main GPT partition list is invalid, trying backup.\n"); + warn("Checksum of the main GPT partition list is invalid, trying backup."); free(gptl); /* secondary array directly precedes secondary header */ if (!(gptl = disk_read_sectors(di, gpth->lba_alt - gpt_lcnt, gpt_lcnt))) { - error("Couldn't read backup GPT partition list.\n"); + error("Couldn't read backup GPT partition list."); goto bail; } if (!valid_crc(gpth->table_chksum, (const uint8_t *)gptl, gpt_lsiz)) { - error("Checksum of the backup GPT partition list is invalid, giving up.\n"); + error("Checksum of the backup GPT partition list is invalid, giving up."); goto bail; } } diff --git a/com32/chain/utility.h b/com32/chain/utility.h index cc2c93aa..ac056dce 100644 --- a/com32/chain/utility.h +++ b/com32/chain/utility.h @@ -54,12 +54,23 @@ int drvoff_detect(int type); int bpb_detect(const uint8_t *bpb, const char *tag); int guid_is0(const struct guid *guid); -static inline -void error(const char *msg) +static inline int warn(const char *x) { - fputs(msg, stderr); + return fprintf(stderr, "WARN: %s\n", x); } +static inline int error(const char *x) +{ + return fprintf(stderr, "ERR: %s\n", x); +} + +static inline int crit(const char *x) +{ + return fprintf(stderr, "CRIT: %s @%s:%d\n", x, __FILE__, __LINE__); +} + +#define critm() crit("Malloc failure.") + #endif /* vim: set ts=8 sts=4 sw=4 noet: */ diff --git a/doc/chain.txt b/doc/chain.txt index 6dd0632d..e71b1c0b 100644 --- a/doc/chain.txt +++ b/doc/chain.txt @@ -53,29 +53,27 @@ Module invocation: chain [drive/partition] [options] +In case of repeated arguments, rightmost ones take precedence. + + DRIVE / PARTITION SPECIFICATION Drive can be specified as 'hd#', 'fd#', 'boot', 'mbr', or 'guid'. -- 'mbr' will select a drive by a signature. -- 'guid' will select a drive by a guid +- 'mbr' will select a drive by its signature. +- 'guid' will select a drive by its guid (GPT only). - 'boot' is the drive syslinux was booted from. This is the default value, if nothing else is specified. - 'hd#' and 'fd#' are standard ways to specify drive number as seen by bios, starting from 0. -Option 'guid' is shared with partition selection (see below). If you happened +Option 'guid' is shared with partition selection (see below). If you happen to have non-unique guids, they are searched in disk0, partitions of disk0, disk1 ... order. -The priority of those options are the same as in the above list. - -If you specify the same value more than once, the last value will be used. - 'mbr' and 'guid' take extra parameter - you should use ':' or '=' as a delimiter. - Partition can be specified as '#', 'guid', 'label' or 'fs'. - 'guid' option will select a partition by a guid (not a type guid !) @@ -85,11 +83,10 @@ Partition can be specified as '#', 'guid', 'label' or 'fs'. - '#' is the standard method. Partitions 1-4 are primary, 5+ logical, 0 = boot MBR (default). -The priority of those options are the same as in the above list. - If you use a number to select a partition it should be specified after a drive using space or comma as delimiters (after 'hd#', 'fd#', 'mbr', 'guid' or 'boot'). + OPTIONS file=<file> *nofile @@ -110,7 +107,7 @@ This triplet lets you alter the addresses a file will use. It's loaded at other bootloader or kernel, it's almost always mandatory. The defaults, if option is not specified, are 0:0x7c00:0x7c00 -If any of the fields are ommited (e.g. 0x2000::), they default to 0. +If any of the fields are omitted (e.g. 0x2000::), they default to 0. sect=<segment>:<offset>:<ip> nosect @@ -126,7 +123,7 @@ expect relocated sector at some particular address (e.g. DRKM). is being chainloaded, sector is not necessary. The defaults if option is not specified, are 0:0x7c00:0x7c00. -If some of the fields are ommited (e.g. 0x2000::), they default to 0. +If some of the fields are omitted (e.g. 0x2000::), they default to 0. *maps nomaps |