diff options
author | Michal Soltys <soltys@ziu.info> | 2010-09-30 22:43:31 +0200 |
---|---|---|
committer | Michal Soltys <soltys@ziu.info> | 2010-10-08 12:40:51 +0200 |
commit | 17919c262e19656409d42f5c88c6d4473d8eb99e (patch) | |
tree | eb8892532b65011d97847fb8fa7366fb91410e78 | |
parent | 81f86009696b5c7eff76e1981e967367235c5f7c (diff) | |
download | syslinux-17919c262e19656409d42f5c88c6d4473d8eb99e.tar.gz syslinux-17919c262e19656409d42f5c88c6d4473d8eb99e.tar.xz syslinux-17919c262e19656409d42f5c88c6d4473d8eb99e.zip |
com32/chain: simplify pentry_mangle()
pentry_mangle() has been simplified and made more readable, using
non-selfkilling iterators, introduced recently.
Further plan is to move 'mbrchs' into separate module (fixit.c32)
providing such feature for all disks (along with some other features,
including [un]hide[all]).
Signed-off-by: Michal Soltys <soltys@ziu.info>
-rw-r--r-- | com32/chain/chain.c | 68 |
1 files changed, 34 insertions, 34 deletions
diff --git a/com32/chain/chain.c b/com32/chain/chain.c index d33da6af..cb619fb2 100644 --- a/com32/chain/chain.c +++ b/com32/chain/chain.c @@ -334,23 +334,35 @@ bail: free(mbr); } #endif -static int pem_sethide(struct disk_dos_part_entry *dp, int midx, int idx) + +static int pem_sethide(struct part_iter *miter, struct part_iter *iter) { + struct disk_dos_part_entry *mdp, *dp; static const uint16_t mask = (1 << 0x01) | (1 << 0x04) | (1 << 0x06) | (1 << 0x07) | (1 << 0x0b) | (1 << 0x0c) | (1 << 0x0e); uint8_t t; + mdp = (struct disk_dos_part_entry *)miter->record; + dp = (struct disk_dos_part_entry *)iter->record; t = dp->ostype; + if ((t <= 0x1f) && ((mask >> (t & ~0x10u)) & 1)) { /* It's a hideable partition type */ - if (midx == idx) + if (miter->index == iter->index) t &= (uint8_t)(~0x10u); /* unhide */ else t |= 0x10u; /* hide */ } - if (t != dp->ostype) { + if (dp->ostype != t) { dp->ostype = t; + /* + * the type of the partition being booted has to be adjusted in + * the match iterator (miter) as well + */ + if (miter->index == iter->index) { + mdp->ostype = t; + } return -1; } return 0; @@ -378,59 +390,47 @@ static int pem_setchs(const struct disk_info *di, *(uint32_t *)dp->end != ochs2; } -static int pentry_mangle(struct part_iter *_iter) +static int pentry_mangle(struct part_iter *miter) { int wb = 0, werr = 0; - uint32_t cebr_lba = 0; struct part_iter *iter = NULL; struct disk_dos_part_entry *dp; - struct disk_dos_mbr mbr; int ridx; - if (_iter->type != typedos) { + if (miter->type != typedos) { error("Partition entry mangling ('hide[all]', 'mbrchs')\n" "is meaningful only for legacy partition scheme."); goto bail; } - if ((_iter->index < 1 || _iter->index > 4) && opt.hide == 1) + if ((miter->index < 1 || miter->index > 4) && opt.hide == 1) error("WARNING: option 'hide' specified with a non-primary partition.\n"); - if (!(iter = pi_begin(&_iter->di, 1))) /* turn on stepall */ + if (!(iter = pi_begin(&miter->di, 1))) /* turn on stepall */ goto bail; - memcpy(&mbr, iter->data, sizeof(struct disk_dos_mbr)); - - while (!pi_next(&iter) && !werr) { + while (!pi_next(&iter) && !werr && (opt.hide == 2 || opt.mbrchs)) { ridx = iter->rawindex; - if (ridx > 4) { - if (opt.hide < 2 && !opt.mbrchs) - break; /* don't walk unnecessarily */ - if (wb && !werr) { - werr |= disk_write_sectors(&iter->di, cebr_lba, &mbr, 1); - wb = false; + dp = (struct disk_dos_part_entry *)iter->record; + + if (dp->ostype) { + if (opt.hide == 2 || (opt.hide == 1 && ridx <= 4)) { + wb |= pem_sethide(miter, iter); } - memcpy(&mbr, iter->data, sizeof(struct disk_dos_mbr)); - cebr_lba = iter->sub.dos.cebr_lba; - dp = mbr.table; - } else - dp = mbr.table + ridx - 1; - if (opt.hide == 2 || - (opt.hide == 1 && ridx <= 4)) { - wb |= pem_sethide(dp, _iter->index, iter->index); - if (_iter->index == iter->index) { - ((struct disk_dos_part_entry *)_iter->record)->ostype = - dp->ostype; + if (opt.mbrchs) { + wb |= pem_setchs(&iter->di, dp, (uint32_t)iter->start_lba); + if (ridx > 4) + wb |= pem_setchs(&iter->di, dp + 1, iter->sub.dos.nebr_lba); } } - if (opt.mbrchs) { - wb |= pem_setchs(&iter->di, dp, (uint32_t)iter->start_lba); - if (ridx > 4) - wb |= pem_setchs(&iter->di, mbr.table + 1, iter->sub.dos.nebr_lba); + + if (ridx >= 4 && wb && !werr) { + werr |= disk_write_sectors(&iter->di, iter->sub.dos.cebr_lba, iter->data, 1); + wb = 0; } } /* last write */ if (wb && !werr) - werr |= disk_write_sectors(&_iter->di, cebr_lba, &mbr, 1); + werr |= disk_write_sectors(&miter->di, iter->sub.dos.cebr_lba, iter->data, 1); bail: pi_del(&iter); |