From 2ef260d392537d22c927735e6b9e78b02d36bb7b Mon Sep 17 00:00:00 2001 From: "H. Peter Anvin" Date: Sun, 20 Jun 2010 17:01:15 -0700 Subject: [PATCH] Merge syslinux/extlinux patch code and core code Merge the SYSLINUX and EXTLINUX patching code and core code, removing EXTLINUX as a separate derivative. All the disk-based systems now use the same code. Signed-off-by: H. Peter Anvin --- core/Makefile | 7 -- core/extlinux.asm | 38 --------- core/ldlinux.asm | 4 + dos/Makefile | 1 + dos/syslinux.c | 2 +- dosutil/mdiskchk.com | Bin 8184 -> 8246 bytes extlinux/Makefile | 5 +- extlinux/fat.h | 57 +------------ extlinux/main.c | 210 +++++++----------------------------------------- libinstaller/Makefile | 7 -- libinstaller/fat.c | 129 +++++++++++++++++++++++++++++ libinstaller/syslinux.h | 3 +- libinstaller/syslxint.h | 2 +- libinstaller/syslxmod.c | 114 +++----------------------- linux/Makefile | 5 +- linux/syslinux.c | 2 +- mtools/Makefile | 1 + mtools/syslinux.c | 2 +- win32/Makefile | 1 + win32/syslinux.c | 2 +- 20 files changed, 190 insertions(+), 402 deletions(-) delete mode 100644 core/extlinux.asm create mode 100644 libinstaller/fat.c diff --git a/core/Makefile b/core/Makefile index 166f0e4..1330fb9 100644 --- a/core/Makefile +++ b/core/Makefile @@ -33,7 +33,6 @@ CODEPAGE = cp865 # The targets to build in this directory... BTARGET = kwdhash.gen \ - extlinux.bin extlinux.bss extlinux.sys \ ldlinux.bss ldlinux.sys ldlinux.bin \ isolinux.bin isolinux-debug.bin pxelinux.0 @@ -109,12 +108,6 @@ ldlinux.bss: ldlinux.bin ldlinux.sys: ldlinux.bin dd if=$< of=$@ bs=512 skip=1 -extlinux.bss: extlinux.bin - dd if=$< of=$@ bs=512 count=1 - -extlinux.sys: extlinux.bin - dd if=$< of=$@ bs=512 skip=1 - codepage.cp: ../codepage/$(CODEPAGE).cp cp -f $< $@ diff --git a/core/extlinux.asm b/core/extlinux.asm deleted file mode 100644 index 9538576..0000000 --- a/core/extlinux.asm +++ /dev/null @@ -1,38 +0,0 @@ -; -*- fundamental -*- (asm-mode sucks) -; **************************************************************************** -; -; extlinux.asm -; -; A program to boot Linux kernels off an ext2/ext3 filesystem. -; -; Copyright 1994-2009 H. Peter Anvin - All Rights Reserved -; Copyright 2009 Intel Corporation; author: H. Peter Anvin -; -; This program is free software; you can redistribute it and/or modify -; it under the terms of the GNU General Public License as published by -; the Free Software Foundation, Inc., 53 Temple Place Ste 330, -; Boston MA 02111-1307, USA; either version 2 of the License, or -; (at your option) any later version; incorporated herein by reference. -; -; **************************************************************************** - -%define IS_EXTLINUX 1 -%include "head.inc" - -; -; Some semi-configurable constants... change on your own risk. -; -my_id equ extlinux_id - - section .rodata - alignz 4 -ROOT_FS_OPS: - extern vfat_fs_ops - dd vfat_fs_ops - extern ext2_fs_ops - dd ext2_fs_ops - extern btrfs_fs_ops - dd btrfs_fs_ops - dd 0 - -%include "diskfs.inc" diff --git a/core/ldlinux.asm b/core/ldlinux.asm index 23540ea..f62f55b 100644 --- a/core/ldlinux.asm +++ b/core/ldlinux.asm @@ -35,6 +35,10 @@ my_id equ syslinux_id ROOT_FS_OPS: extern vfat_fs_ops dd vfat_fs_ops + extern ext2_fs_ops + dd ext2_fs_ops + extern btrfs_fs_ops + dd btrfs_fs_ops dd 0 %include "diskfs.inc" diff --git a/dos/Makefile b/dos/Makefile index 7392571..d4d20c7 100644 --- a/dos/Makefile +++ b/dos/Makefile @@ -26,6 +26,7 @@ INCLUDES = -include code16.h -nostdinc -iwithprefix include \ -I. -I.. -I../libfat -I ../libinstaller SRCS = syslinux.c \ + ../libinstaller/fat.c \ ../libinstaller/syslxmod.c \ ../libinstaller/bootsect_bin.c \ ../libinstaller/ldlinux_bin.c \ diff --git a/dos/syslinux.c b/dos/syslinux.c index 94517e8..5dc3483 100644 --- a/dos/syslinux.c +++ b/dos/syslinux.c @@ -755,7 +755,7 @@ int main(int argc, char *argv[]) /* * Patch ldlinux.sys and the boot sector */ - i = syslinux_patch(sectors, nsectors, stupid, raid_mode, subdir); + i = syslinux_patch(sectors, nsectors, stupid, raid_mode, subdir, NULL); patch_sectors = (i + SECTOR_SIZE - 1) >> SECTOR_SHIFT; /* diff --git a/dosutil/mdiskchk.com b/dosutil/mdiskchk.com index 5a6cc8e70ca7f1c4f2d738574dbb55b066d62dc6..b18a187c589f465a715ba81b0dbcd49509a46cda 100644 GIT binary patch delta 7909 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 DJI*%( delta 7842 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, lba); - set_16_sl(&ex->len, len); - ex++; - } - - base = addr; - lba = sect; - len = 1; - - next: - addr += SECTOR_SIZE; - nsect--; - } - - if (len) { - set_64_sl(&ex->lba, lba); - set_16_sl(&ex->len, len); - ex++; - } -} - -/* - * Form a pointer based on a 16-bit patcharea/epa field - */ -static inline void *ptr(void *img, uint16_t *offset_p) -{ - return (char *)img + get_16_sl(offset_p); -} - -/* * Query the device geometry and put it into the boot sector. * Map the file and put the map in the boot sector and file. * Stick the "current directory" inode number into the file. @@ -253,15 +178,9 @@ int patch_file_and_bootblock(int fd, const char *dir, int devfd) sector_t *sectp; uint64_t totalbytes, totalsectors; int nsect; - uint32_t *wp; struct boot_sector *sbs; - struct patch_area *patcharea; - struct ext_patch_area *epa; - struct syslinux_extent *ex; - int i, dw, nptrs; - uint32_t csum; char *dirpath, *subpath, *xdirpath, *xsubpath; - uint64_t *advptrs; + int rv; dirpath = realpath(dir, NULL); if (!dirpath || stat(dir, &dirst)) { @@ -318,7 +237,7 @@ int patch_file_and_bootblock(int fd, const char *dir, int devfd) early bootstrap share code with the FAT version. */ dprintf("heads = %u, sect = %u\n", geo.heads, geo.sectors); - sbs = (struct boot_sector *)boot_block; + sbs = (struct boot_sector *)syslinux_bootsect; totalsectors = totalbytes >> SECTOR_SHIFT; if (totalsectors >= 65536) { @@ -333,7 +252,7 @@ int patch_file_and_bootblock(int fd, const char *dir, int devfd) set_16(&sbs->bsHeads, geo.heads); set_32(&sbs->bsHiddenSecs, geo.start); - /* Construct the boot file */ + /* Construct the boot file map */ dprintf("directory inode = %lu\n", (unsigned long)dirst.st_ino); nsect = (boot_image_len + SECTOR_SIZE - 1) >> SECTOR_SHIFT; @@ -348,92 +267,15 @@ int patch_file_and_bootblock(int fd, const char *dir, int devfd) int i; for (i = 0; i < nsect; i++) - *(sectp + i) = BTRFS_EXTLINUX_OFFSET/SECTOR_SIZE + i; + sectp[i] = BTRFS_EXTLINUX_OFFSET/SECTOR_SIZE + i; } - /* Search for LDLINUX_MAGIC to find the patch area */ - for (wp = (uint32_t *) boot_image; get_32_sl(wp) != LDLINUX_MAGIC; - wp++) - ; - patcharea = (struct patch_area *)wp; - epa = ptr(boot_image, &patcharea->epaoffset); - - /* First sector need pointer in boot sector */ - set_32(ptr(sbs, &epa->sect1ptr0), sectp[0]); - set_32(ptr(sbs, &epa->sect1ptr1), sectp[0] >> 32); - sectp++; - - /* Handle RAID mode */ - if (opt.raid_mode) { - /* Patch in INT 18h = CD 18 */ - set_16(ptr(sbs, &epa->raidpatch), 0x18CD); - } - - /* Set up the totals */ - dw = boot_image_len >> 2; /* COMPLETE dwords, excluding ADV */ - set_16_sl(&patcharea->data_sectors, nsect - 2); /* Not including ADVs */ - set_16_sl(&patcharea->adv_sectors, 2); /* ADVs need 2 sectors */ - set_32_sl(&patcharea->dwords, dw); - - /* Stupid mode? */ - if (opt.stupid_mode) { - /* Access only one sector at a time */ - set_16_sl(&patcharea->maxtransfer, 1); - } - - /* Set the sector extents */ - ex = ptr(boot_image, &epa->secptroffset); - nptrs = get_16_sl(&epa->secptrcnt); - - if (nsect > nptrs) { - /* Not necessarily an error in this case, but a general problem */ - fprintf(stderr, "Insufficient extent space, build error!\n"); - exit(1); - } - - /* -1 for the pointer in the boot sector, -2 for the two ADVs */ - generate_extents(ex, nptrs, sectp, nsect-1-2); - - /* ADV pointers */ - advptrs = ptr(boot_image, &epa->advptroffset); - set_64_sl(&advptrs[0], sectp[nsect-1-2]); - set_64_sl(&advptrs[1], sectp[nsect-1-1]); + /* Create the modified image in memory */ + rv = syslinux_patch(sectp, nsect, opt.stupid_mode, + opt.raid_mode, subpath, subvol); - /* Poke in the base directory path */ - if (subpath) { - int sublen = strlen(subpath) + 1; - if (get_16_sl(&epa->dirlen) < sublen) { - fprintf(stderr, "Subdirectory path too long... aborting install!\n"); - exit(1); - } - memcpy_to_sl(ptr(boot_image, &epa->diroffset), subpath, sublen); - } free(dirpath); - - /* Poke in the subvolume information */ - if (1 /* subvol */) { - int sublen = strlen(subvol) + 1; - if (get_16_sl(&epa->subvollen) < sublen) { - fprintf(stderr, "Subvol name too long... aborting install!\n"); - exit(1); - } - memcpy_to_sl(ptr(boot_image, &epa->subvoloffset), subvol, sublen); - } - - /* Now produce a checksum */ - set_32_sl(&patcharea->checksum, 0); - - csum = LDLINUX_MAGIC; - for (i = 0, wp = (uint32_t *) boot_image; i < dw; i++, wp++) - csum -= get_32_sl(wp); /* Negative checksum */ - - set_32_sl(&patcharea->checksum, csum); - - /* - * Assume all bytes modified. This can be optimized at the expense - * of keeping track of what the highest modified address ever was. - */ - return dw << 2; + return rv; } /* @@ -503,7 +345,7 @@ int install_bootblock(int fd, const char *device) return 1; } if (fs_type == VFAT) { - struct boot_sector *sbs = (struct boot_sector *)extlinux_bootsect; + struct boot_sector *sbs = (struct boot_sector *)syslinux_bootsect; if (xpwrite(fd, &sbs->bsHead, bsHeadLen, 0) != bsHeadLen || xpwrite(fd, &sbs->bsCode, bsCodeLen, offsetof(struct boot_sector, bsCode)) != bsCodeLen) { @@ -511,7 +353,8 @@ int install_bootblock(int fd, const char *device) return 1; } } else { - if (xpwrite(fd, boot_block, boot_block_len, 0) != boot_block_len) { + if (xpwrite(fd, syslinux_bootsect, syslinux_bootsect_len, 0) + != syslinux_bootsect_len) { perror("writing bootblock"); return 1; } @@ -526,7 +369,7 @@ int ext2_fat_install_file(const char *path, int devfd, struct stat *rst) int fd = -1, dirfd = -1; int modbytes; - asprintf(&file, "%s%sextlinux.sys", + asprintf(&file, "%s%sldlinux.sys", path, path[0] && path[strlen(path) - 1] == '/' ? "" : "/"); if (!file) { perror(program); @@ -597,9 +440,9 @@ bail: return 1; } -/* btrfs has to install the extlinux.sys in the first 64K blank area, which +/* btrfs has to install the ldlinux.sys in the first 64K blank area, which is not managered by btrfs tree, so actually this is not installed as files. - since the cow feature of btrfs will move the extlinux.sys every where */ + since the cow feature of btrfs will move the ldlinux.sys every where */ int btrfs_install_file(const char *path, int devfd, struct stat *rst) { patch_file_and_bootblock(-1, path, devfd); @@ -631,14 +474,17 @@ int install_file(const char *path, int devfd, struct stat *rst) return 1; } -/* EXTLINUX installs the string 'EXTLINUX' at offset 3 in the boot - sector; this is consistent with FAT filesystems. */ +/* + * SYSLINUX installs the string 'SYSLINUX' at offset 3 in the boot + * sector; this is consistent with FAT filesystems. Earlier versions + * would install the string "EXTLINUX" instead, handle both. + */ int already_installed(int devfd) { char buffer[8]; xpread(devfd, buffer, 8, 3); - return !memcmp(buffer, "EXTLINUX", 8); + return !memcmp(buffer, "SYSLINUX", 8) || !memcmp(buffer, "EXTLINUX", 8); } #ifdef __KLIBC__ @@ -843,7 +689,7 @@ static int open_device(const char *path, struct stat *st, const char **_devname) static int ext_read_adv(const char *path, const char *cfg, int devfd) { - if (fs_type == BTRFS) { /* btrfs "extlinux.sys" is in 64k blank area */ + if (fs_type == BTRFS) { /* btrfs "ldlinux.sys" is in 64k blank area */ if (xpread(devfd, syslinux_adv, 2 * ADV_SIZE, BTRFS_ADV_OFFSET) != 2 * ADV_SIZE) { perror("btrfs writing adv"); @@ -856,7 +702,7 @@ static int ext_read_adv(const char *path, const char *cfg, int devfd) static int ext_write_adv(const char *path, const char *cfg, int devfd) { - if (fs_type == BTRFS) { /* btrfs "extlinux.sys" is in 64k blank area */ + if (fs_type == BTRFS) { /* btrfs "ldlinux.sys" is in 64k blank area */ if (xpwrite(devfd, syslinux_adv, 2 * ADV_SIZE, BTRFS_ADV_OFFSET) != 2 * ADV_SIZE) { perror("writing adv"); @@ -878,7 +724,7 @@ int install_loader(const char *path, int update_only) return 1; if (update_only && !already_installed(devfd)) { - fprintf(stderr, "%s: no previous extlinux boot sector found\n", + fprintf(stderr, "%s: no previous syslinux boot sector found\n", program); close(devfd); return 1; @@ -887,7 +733,7 @@ int install_loader(const char *path, int update_only) /* Read a pre-existing ADV, if already installed */ if (opt.reset_adv) syslinux_reset_adv(syslinux_adv); - else if (ext_read_adv(path, "extlinux.sys", devfd) < 0) { + else if (ext_read_adv(path, "ldlinux.sys", devfd) < 0) { close(devfd); return 1; } @@ -896,7 +742,7 @@ int install_loader(const char *path, int update_only) return 1; } - /* Install extlinux.sys */ + /* Install ldlinux.sys */ if (install_file(path, devfd, &fst)) { close(devfd); return 1; @@ -929,7 +775,7 @@ int modify_existing_adv(const char *path) if (opt.reset_adv) syslinux_reset_adv(syslinux_adv); - else if (ext_read_adv(path, "extlinux.sys", devfd) < 0) { + else if (ext_read_adv(path, "ldlinux.sys", devfd) < 0) { close(devfd); return 1; } @@ -937,7 +783,7 @@ int modify_existing_adv(const char *path) close(devfd); return 1; } - if (ext_write_adv(path, "extlinux.sys", devfd) < 0) { + if (ext_write_adv(path, "ldlinux.sys", devfd) < 0) { close(devfd); return 1; } diff --git a/libinstaller/Makefile b/libinstaller/Makefile index 82c1990..2beb931 100644 --- a/libinstaller/Makefile +++ b/libinstaller/Makefile @@ -1,6 +1,5 @@ # _bin.c files required by both BTARGET and ITARGET installers BINFILES = bootsect_bin.c ldlinux_bin.c \ - extlinux_bss_bin.c extlinux_sys_bin.c \ mbr_bin.c gptmbr_bin.c PERL = perl @@ -13,12 +12,6 @@ bootsect_bin.c: ../core/ldlinux.bss bin2c.pl ldlinux_bin.c: ../core/ldlinux.sys bin2c.pl $(PERL) bin2c.pl syslinux_ldlinux 512 < $< > $@ -extlinux_bss_bin.c: ../core/extlinux.bss bin2c.pl - $(PERL) bin2c.pl extlinux_bootsect < $< > $@ - -extlinux_sys_bin.c: ../core/extlinux.sys bin2c.pl - $(PERL) bin2c.pl extlinux_image 512 < $< > $@ - mbr_bin.c: ../mbr/mbr.bin bin2c.pl $(PERL) bin2c.pl syslinux_mbr < $< > $@ diff --git a/libinstaller/fat.c b/libinstaller/fat.c new file mode 100644 index 0000000..e210135 --- /dev/null +++ b/libinstaller/fat.c @@ -0,0 +1,129 @@ +/* ----------------------------------------------------------------------- * + * + * Copyright 1998-2008 H. Peter Anvin - All Rights Reserved + * Copyright 2009-2010 Intel Corporation; author H. Peter Anvin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, Inc., 53 Temple Place Ste 330, + * Boston MA 02111-1307, USA; either version 2 of the License, or + * (at your option) any later version; incorporated herein by reference. + * + * ----------------------------------------------------------------------- */ + +/* + * fat.c - Initial sanity check for FAT-based installers + */ + +#define _XOPEN_SOURCE 500 /* Required on glibc 2.x */ +#define _BSD_SOURCE +#include +#include +#include +#include +#include + +#include "syslinux.h" +#include "syslxint.h" + +void syslinux_make_bootsect(void *bs) +{ + struct boot_sector *bootsect = bs; + const struct boot_sector *sbs = + (const struct boot_sector *)boot_sector; + + memcpy(&bootsect->bsHead, &sbs->bsHead, bsHeadLen); + memcpy(&bootsect->bsCode, &sbs->bsCode, bsCodeLen); +} + +/* + * Check to see that what we got was indeed an MS-DOS boot sector/superblock; + * Return NULL if OK and otherwise an error message; + */ +const char *syslinux_check_bootsect(const void *bs) +{ + int veryold; + int sectorsize; + long long sectors, fatsectors, dsectors; + long long clusters; + int rootdirents, clustersize; + const struct boot_sector *sectbuf = bs; + + veryold = 0; + + /* Must be 0xF0 or 0xF8..0xFF */ + if (get_8(§buf->bsMedia) != 0xF0 && get_8(§buf->bsMedia) < 0xF8) + return "invalid media signature (not a FAT filesystem?)"; + + sectorsize = get_16(§buf->bsBytesPerSec); + if (sectorsize == SECTOR_SIZE) + ; /* ok */ + else if (sectorsize >= 512 && sectorsize <= 4096 && + (sectorsize & (sectorsize - 1)) == 0) + return "unsupported sectors size"; + else + return "impossible sector size"; + + clustersize = get_8(§buf->bsSecPerClust); + if (clustersize == 0 || (clustersize & (clustersize - 1))) + return "impossible cluster size"; + + sectors = get_16(§buf->bsSectors); + sectors = sectors ? sectors : get_32(§buf->bsHugeSectors); + + dsectors = sectors - get_16(§buf->bsResSectors); + + fatsectors = get_16(§buf->bsFATsecs); + fatsectors = fatsectors ? fatsectors : get_32(§buf->bs32.FATSz32); + fatsectors *= get_8(§buf->bsFATs); + dsectors -= fatsectors; + + rootdirents = get_16(§buf->bsRootDirEnts); + dsectors -= (rootdirents + sectorsize / 32 - 1) / sectorsize; + + if (dsectors < 0) + return "negative number of data sectors"; + + if (fatsectors == 0) + return "zero FAT sectors"; + + clusters = dsectors / clustersize; + + if (clusters < 0xFFF5) { + /* FAT12 or FAT16 */ + + if (!get_16(§buf->bsFATsecs)) + return "zero FAT sectors (FAT12/16)"; + + if (get_8(§buf->bs16.BootSignature) == 0x29) { + if (!memcmp(§buf->bs16.FileSysType, "FAT12 ", 8)) { + if (clusters >= 0xFF5) + return "more than 4084 clusters but claims FAT12"; + } else if (!memcmp(§buf->bs16.FileSysType, "FAT16 ", 8)) { + if (clusters < 0xFF5) + return "less than 4084 clusters but claims FAT16"; + } else if (!memcmp(§buf->bs16.FileSysType, "FAT32 ", 8)) { + return "less than 65525 clusters but claims FAT32"; + } else if (memcmp(§buf->bs16.FileSysType, "FAT ", 8)) { + static char fserr[] = + "filesystem type \"????????\" not supported"; + memcpy(fserr + 17, §buf->bs16.FileSysType, 8); + return fserr; + } + } + } else if (clusters < 0x0FFFFFF5) { + /* + * FAT32... + * + * Moving the FileSysType and BootSignature was a lovely stroke + * of M$ idiocy... + */ + if (get_8(§buf->bs32.BootSignature) != 0x29 || + memcmp(§buf->bs32.FileSysType, "FAT32 ", 8)) + return "missing FAT32 signature"; + } else { + return "impossibly large number of clusters"; + } + + return NULL; +} diff --git a/libinstaller/syslinux.h b/libinstaller/syslinux.h index bf2b716..710d30e 100644 --- a/libinstaller/syslinux.h +++ b/libinstaller/syslinux.h @@ -48,6 +48,7 @@ const char *syslinux_check_bootsect(const void *bs); /* This patches the boot sector and ldlinux.sys based on a sector map */ typedef uint64_t sector_t; int syslinux_patch(const sector_t *sectors, int nsectors, - int stupid, int raid_mode, const char *subdir); + int stupid, int raid_mode, + const char *subdir, const char *subvol); #endif diff --git a/libinstaller/syslxint.h b/libinstaller/syslxint.h index 3af7c3d..f16c2e5 100644 --- a/libinstaller/syslxint.h +++ b/libinstaller/syslxint.h @@ -238,7 +238,7 @@ struct boot_sector { } __attribute__ ((packed)); #define bsHead bsJump -#define bsHeadLen offsetof(struct boot_sector, bsOemName) +#define bsHeadLen offsetof(struct boot_sector, bsBytesPerSec) #define bsCode bs32.Code /* The common safe choice */ #define bsCodeLen (offsetof(struct boot_sector, bsSignature) - \ offsetof(struct boot_sector, bsCode)) diff --git a/libinstaller/syslxmod.c b/libinstaller/syslxmod.c index 6f5adca..a68f19f 100644 --- a/libinstaller/syslxmod.c +++ b/libinstaller/syslxmod.c @@ -26,107 +26,6 @@ #include "syslinux.h" #include "syslxint.h" -void syslinux_make_bootsect(void *bs) -{ - struct boot_sector *bootsect = bs; - const struct boot_sector *sbs = - (const struct boot_sector *)boot_sector; - - memcpy(&bootsect->bsHead, &sbs->bsHead, bsHeadLen); - memcpy(&bootsect->bsCode, &sbs->bsCode, bsCodeLen); -} - -/* - * Check to see that what we got was indeed an MS-DOS boot sector/superblock; - * Return NULL if OK and otherwise an error message; - */ -const char *syslinux_check_bootsect(const void *bs) -{ - int veryold; - int sectorsize; - long long sectors, fatsectors, dsectors; - long long clusters; - int rootdirents, clustersize; - const struct boot_sector *sectbuf = bs; - - veryold = 0; - - /* Must be 0xF0 or 0xF8..0xFF */ - if (get_8(§buf->bsMedia) != 0xF0 && get_8(§buf->bsMedia) < 0xF8) - return "invalid media signature (not a FAT filesystem?)"; - - sectorsize = get_16(§buf->bsBytesPerSec); - if (sectorsize == SECTOR_SIZE) - ; /* ok */ - else if (sectorsize >= 512 && sectorsize <= 4096 && - (sectorsize & (sectorsize - 1)) == 0) - return "unsupported sectors size"; - else - return "impossible sector size"; - - clustersize = get_8(§buf->bsSecPerClust); - if (clustersize == 0 || (clustersize & (clustersize - 1))) - return "impossible cluster size"; - - sectors = get_16(§buf->bsSectors); - sectors = sectors ? sectors : get_32(§buf->bsHugeSectors); - - dsectors = sectors - get_16(§buf->bsResSectors); - - fatsectors = get_16(§buf->bsFATsecs); - fatsectors = fatsectors ? fatsectors : get_32(§buf->bs32.FATSz32); - fatsectors *= get_8(§buf->bsFATs); - dsectors -= fatsectors; - - rootdirents = get_16(§buf->bsRootDirEnts); - dsectors -= (rootdirents + sectorsize / 32 - 1) / sectorsize; - - if (dsectors < 0) - return "negative number of data sectors"; - - if (fatsectors == 0) - return "zero FAT sectors"; - - clusters = dsectors / clustersize; - - if (clusters < 0xFFF5) { - /* FAT12 or FAT16 */ - - if (!get_16(§buf->bsFATsecs)) - return "zero FAT sectors (FAT12/16)"; - - if (get_8(§buf->bs16.BootSignature) == 0x29) { - if (!memcmp(§buf->bs16.FileSysType, "FAT12 ", 8)) { - if (clusters >= 0xFF5) - return "more than 4084 clusters but claims FAT12"; - } else if (!memcmp(§buf->bs16.FileSysType, "FAT16 ", 8)) { - if (clusters < 0xFF5) - return "less than 4084 clusters but claims FAT16"; - } else if (!memcmp(§buf->bs16.FileSysType, "FAT32 ", 8)) { - return "less than 65525 clusters but claims FAT32"; - } else if (memcmp(§buf->bs16.FileSysType, "FAT ", 8)) { - static char fserr[] = - "filesystem type \"????????\" not supported"; - memcpy(fserr + 17, §buf->bs16.FileSysType, 8); - return fserr; - } - } - } else if (clusters < 0x0FFFFFF5) { - /* - * FAT32... - * - * Moving the FileSysType and BootSignature was a lovely stroke - * of M$ idiocy... - */ - if (get_8(§buf->bs32.BootSignature) != 0x29 || - memcmp(§buf->bs32.FileSysType, "FAT32 ", 8)) - return "missing FAT32 signature"; - } else { - return "impossibly large number of clusters"; - } - - return NULL; -} /* * Generate sector extents @@ -197,7 +96,8 @@ static inline void *ptr(void *img, uint16_t *offset_p) #define NADV 2 int syslinux_patch(const sector_t *sectp, int nsectors, - int stupid, int raid_mode, const char *subdir) + int stupid, int raid_mode, + const char *subdir, const char *subvol) { struct patch_area *patcharea; struct ext_patch_area *epa; @@ -270,6 +170,16 @@ int syslinux_patch(const sector_t *sectp, int nsectors, memcpy_to_sl(ptr(boot_image, &epa->diroffset), subdir, sublen); } + /* Poke in the subvolume information */ + if (subvol) { + int sublen = strlen(subvol) + 1; + if (get_16_sl(&epa->subvollen) < sublen) { + fprintf(stderr, "Subvol name too long... aborting install!\n"); + exit(1); + } + memcpy_to_sl(ptr(boot_image, &epa->subvoloffset), subvol, sublen); + } + /* Now produce a checksum */ set_32_sl(&patcharea->checksum, 0); diff --git a/linux/Makefile b/linux/Makefile index 9bf56d1..c3877f2 100644 --- a/linux/Makefile +++ b/linux/Makefile @@ -17,15 +17,16 @@ topdir = .. include $(topdir)/MCONFIG -OPTFLAGS = -g -Os +OPTFLAGS = -g -O0 -Dalloca=malloc INCLUDES = -I. -I.. -I../libinstaller CFLAGS = $(GCCWARN) -D_FILE_OFFSET_BITS=64 $(OPTFLAGS) $(INCLUDES) -LDFLAGS = -s +LDFLAGS = SRCS = syslinux.c \ ../libinstaller/syslxopt.c \ ../libinstaller/syslxcom.c \ ../libinstaller/setadv.c \ + ../libinstaller/fat.c \ ../libinstaller/syslxmod.c \ ../libinstaller/bootsect_bin.c \ ../libinstaller/ldlinux_bin.c diff --git a/linux/syslinux.c b/linux/syslinux.c index 20de62a..7152d2b 100644 --- a/linux/syslinux.c +++ b/linux/syslinux.c @@ -474,7 +474,7 @@ umount: * Patch ldlinux.sys and the boot sector */ i = syslinux_patch(sectors, ldlinux_sectors, opt.stupid_mode, - opt.raid_mode, subdir); + opt.raid_mode, subdir, NULL); patch_sectors = (i + SECTOR_SIZE - 1) >> SECTOR_SHIFT; /* diff --git a/mtools/Makefile b/mtools/Makefile index 91b6852..5f08b2d 100644 --- a/mtools/Makefile +++ b/mtools/Makefile @@ -7,6 +7,7 @@ CFLAGS = $(GCCWARN) -D_FILE_OFFSET_BITS=64 $(OPTFLAGS) $(INCLUDES) LDFLAGS = -s SRCS = syslinux.c \ + ../libinstaller/fat.c \ ../libinstaller/syslxmod.c \ ../libinstaller/bootsect_bin.c \ ../libinstaller/ldlinux_bin.c \ diff --git a/mtools/syslinux.c b/mtools/syslinux.c index 2b82b33..0f4ccf9 100644 --- a/mtools/syslinux.c +++ b/mtools/syslinux.c @@ -267,7 +267,7 @@ int main(int argc, char *argv[]) libfat_close(fs); /* Patch ldlinux.sys and the boot sector */ - i = syslinux_patch(sectors, nsectors, stupid, raid_mode, subdir); + i = syslinux_patch(sectors, nsectors, stupid, raid_mode, subdir, NULL); patch_sectors = (i + SECTOR_SIZE - 1) >> SECTOR_SHIFT; /* Write the now-patched first sectors of ldlinux.sys */ diff --git a/win32/Makefile b/win32/Makefile index a0be1d4..af95b2e 100644 --- a/win32/Makefile +++ b/win32/Makefile @@ -45,6 +45,7 @@ WINCC_IS_GOOD := $(shell $(WINCC) $(WINCFLAGS) $(WINLDFLAGS) -o hello.exe hello. .SUFFIXES: .c .o .i .s .S SRCS = syslinux.c \ + ../libinstaller/fat.c \ ../libinstaller/syslxmod.c \ ../libinstaller/bootsect_bin.c \ ../libinstaller/ldlinux_bin.c \ diff --git a/win32/syslinux.c b/win32/syslinux.c index bd04273..297b97b 100644 --- a/win32/syslinux.c +++ b/win32/syslinux.c @@ -433,7 +433,7 @@ int main(int argc, char *argv[]) /* * Patch ldlinux.sys and the boot sector */ - syslinux_patch(sectors, nsectors, stupid, raid_mode, subdir); + syslinux_patch(sectors, nsectors, stupid, raid_mode, subdir, NULL); /* * Rewrite the file -- 2.7.4