diff --git a/ChangeLog b/ChangeLog index ce97f6606..e5043acd3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,48 @@ +1999-08-30 OKUJI Yoshinori + + From Edward Killips : + * stage2/cmdline.c (commands): Added hide and unhide. + (enter_cmdline): Likewise. + * stage2/disk_io.c (unhide_partition): New function. + (hide_partition): Likewise. + * stage2/pc_slice.h (PC_SLICE_TYPE_HIDDEN_FLAG): New macro. + +1999-08-29 OKUJI Yoshinori + + From Pavel Roskin : + * stage2/fsys_minix.c (namelen): New variable. + (MINIX_NAME_LEN): Deleted. + (minix_mount): Set NAMELEN to 14 if SUPRTBLOCK->S_MAGIC is + MINIX_SUPER_MAGIC, and set NAMELEN to 30 if it is + MINIX_SUPER_MAGIC2. + (minix_dir): Use NAMELEN instead of MINIX_NAME_LEN. + +1999-08-29 Pavel Roskin + + * grub/Makefile.am, stage1/Makefile.am, stage2/Makefile.am: + Avoid using variables inclosed in '@' because they cannot be + overridden at the make time. + +1999-08-29 Pavel Roskin + + * stage2/fsys_fat.c (fat_create_blocklist): Return 1 for the + root directory on FAT12 and FAT16. + +1999-08-27 OKUJI Yoshinori + + * stage2/boot.c (load_image): Accept two arguments, KERNEL and + ARG. And use them instead of CUR_CMDLINE. + (load_module): Accept two arguments, MODULE and ARG. And use + them instead of CUR_CMDLINE. + (load_initrd): Accept one argument, INITRD. And use it instead + of CUR_CMDLINE. + (bsd_boot): Accept one additional argument, ARG. And use it + instead of CUR_CMDLINE. + * stage2/cmdline.c (enter_cmdline): Use MB_CMDLINE instead of + HEAP for the Multiboot command-line buffer. + * stage2/shared.h (MB_CMDLINE_BUF): New macro. + (MB_CMDLINE_BUFLEN): Likewise. + 1999-08-26 OKUJI Yoshinori * docs/Makefile.am [GRUB_MAINT] (grub.8): The argument for the diff --git a/NEWS b/NEWS index 480290c76..1aa5b7d98 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,7 @@ New in 0.5.93: ext2fs, FAT and FFS support in Stage 2 respectively. * FAT32 support is added. * Minix fs support is added. +* The new commands "hide" and "unhide" are added. New in 0.5.92 - 1999-07-26: * Bug fixes (i.e. Stage 1.5 can work fine again). diff --git a/THANKS b/THANKS index b5126baa1..8b1275dd8 100644 --- a/THANKS +++ b/THANKS @@ -11,6 +11,7 @@ Bradford Hovinen Brian Brunswick Bryan Ford Dan J. Walters +Edward Killips Eric Hanchrow Heiko Schroeder Jochen Hoenicke diff --git a/TODO b/TODO index 405826cb8..597d263d3 100644 --- a/TODO +++ b/TODO @@ -35,6 +35,4 @@ Clean up and enhance the manuals, especially concept indexes. Add more filesystems support (XFS, NTFS, etc.) -??? Add hide and unhide facilities. - Add remote console support (serial, parallel and net). diff --git a/grub/Makefile.am b/grub/Makefile.am index 17df9103c..3e9379396 100644 --- a/grub/Makefile.am +++ b/grub/Makefile.am @@ -1,8 +1,8 @@ sbin_PROGRAMS = grub -AM_CFLAGS = @GRUB_CFLAGS@ -DGRUB_UTIL=1 -DFSYS_EXT2FS=1 -DFSYS_FAT=1 \ +AM_CFLAGS = $(GRUB_CFLAGS) -DGRUB_UTIL=1 -DFSYS_EXT2FS=1 -DFSYS_FAT=1 \ -DFSYS_FFS=1 -DFSYS_MINIX=1 -fwritable-strings \ -I$(top_srcdir)/stage2 -I$(top_srcdir)/stage1 grub_SOURCES = main.c asmstub.c getopt.c getopt1.c getopt.h -grub_LDADD = ../stage2/libgrub.a @GRUB_LIBS@ +grub_LDADD = ../stage2/libgrub.a $(GRUB_LIBS) diff --git a/grub/Makefile.in b/grub/Makefile.in index 75104be31..2b514e5ed 100644 --- a/grub/Makefile.in +++ b/grub/Makefile.in @@ -81,13 +81,13 @@ install_sh = @install_sh@ sbin_PROGRAMS = grub -AM_CFLAGS = @GRUB_CFLAGS@ -DGRUB_UTIL=1 -DFSYS_EXT2FS=1 -DFSYS_FAT=1 \ +AM_CFLAGS = $(GRUB_CFLAGS) -DGRUB_UTIL=1 -DFSYS_EXT2FS=1 -DFSYS_FAT=1 \ -DFSYS_FFS=1 -DFSYS_MINIX=1 -fwritable-strings \ -I$(top_srcdir)/stage2 -I$(top_srcdir)/stage1 grub_SOURCES = main.c asmstub.c getopt.c getopt1.c getopt.h -grub_LDADD = ../stage2/libgrub.a @GRUB_LIBS@ +grub_LDADD = ../stage2/libgrub.a $(GRUB_LIBS) subdir = grub mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = diff --git a/stage1/Makefile.am b/stage1/Makefile.am index 94d913d27..1abfc3f70 100644 --- a/stage1/Makefile.am +++ b/stage1/Makefile.am @@ -3,7 +3,7 @@ nodist_pkgdata_DATA = stage1 stage1_lba CLEANFILES = $(pkgdata_DATA) # We can't use builtins or standard includes. -AM_CFLAGS = @STAGE1_CFLAGS@ -fno-builtin -nostdinc +AM_CFLAGS = $(STAGE1_CFLAGS) -fno-builtin -nostdinc LDFLAGS = -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00 noinst_PROGRAMS = stage1.exec stage1_lba.exec diff --git a/stage1/Makefile.in b/stage1/Makefile.in index cc8fa8b27..82463dd6b 100644 --- a/stage1/Makefile.in +++ b/stage1/Makefile.in @@ -82,7 +82,7 @@ nodist_pkgdata_DATA = stage1 stage1_lba CLEANFILES = $(pkgdata_DATA) # We can't use builtins or standard includes. -AM_CFLAGS = @STAGE1_CFLAGS@ -fno-builtin -nostdinc +AM_CFLAGS = $(STAGE1_CFLAGS) -fno-builtin -nostdinc LDFLAGS = -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00 noinst_PROGRAMS = stage1.exec stage1_lba.exec diff --git a/stage2/Makefile.am b/stage2/Makefile.am index e1d1a289b..d2ed8456d 100644 --- a/stage2/Makefile.am +++ b/stage2/Makefile.am @@ -16,7 +16,7 @@ noinst_LIBRARIES = libgrub.a libgrub_a_SOURCES = boot.c common.c char_io.c cmdline.c disk_io.c \ gunzip.c fsys_ffs.c fsys_ext2fs.c fsys_fat.c fsys_minix.c \ stage2.c -libgrub_a_CFLAGS = @GRUB_CFLAGS@ -DGRUB_UTIL=1 -DFSYS_EXT2FS=1 \ +libgrub_a_CFLAGS = $(GRUB_CFLAGS) -DGRUB_UTIL=1 -DFSYS_EXT2FS=1 \ -DFSYS_FAT=1 -DFSYS_FFS=1 -DFSYS_MINIX=1 -fwritable-strings # Stage 2 and Stage 1.5's. @@ -29,7 +29,7 @@ noinst_PROGRAMS = stage2.exec e2fs_stage1_5.exec fat_stage1_5.exec \ MOSTLYCLEANFILES = $(noinst_PROGRAMS) STAGE2_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8000 -STAGE2_COMPILE = @STAGE2_CFLAGS@ -fno-builtin -nostdinc +STAGE2_COMPILE = $(STAGE2_CFLAGS) -fno-builtin -nostdinc STAGE1_5_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,2000 STAGE1_5_COMPILE = $(STAGE2_COMPILE) -DNO_DECOMPRESSION=1 -DSTAGE1_5=1 \ @@ -40,7 +40,7 @@ STAGE1_5_COMPILE = $(STAGE2_COMPILE) -DNO_DECOMPRESSION=1 -DSTAGE1_5=1 \ stage2_exec_SOURCES = asm.S boot.c common.c char_io.c cmdline.c \ disk_io.c gunzip.c stage2.c bios.c smp-imps.c fsys_ext2fs.c \ fsys_fat.c fsys_ffs.c fsys_minix.c -stage2_exec_CFLAGS = $(STAGE2_COMPILE) @FSYS_CFLAGS@ +stage2_exec_CFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS) stage2_exec_LDFLAGS = $(STAGE2_LINK) # For e2fs_stage1_5 target. diff --git a/stage2/Makefile.in b/stage2/Makefile.in index 9cc1c1d4a..038bc3ea0 100644 --- a/stage2/Makefile.in +++ b/stage2/Makefile.in @@ -98,7 +98,7 @@ libgrub_a_SOURCES = boot.c common.c char_io.c cmdline.c disk_io.c \ gunzip.c fsys_ffs.c fsys_ext2fs.c fsys_fat.c fsys_minix.c \ stage2.c -libgrub_a_CFLAGS = @GRUB_CFLAGS@ -DGRUB_UTIL=1 -DFSYS_EXT2FS=1 \ +libgrub_a_CFLAGS = $(GRUB_CFLAGS) -DGRUB_UTIL=1 -DFSYS_EXT2FS=1 \ -DFSYS_FAT=1 -DFSYS_FFS=1 -DFSYS_MINIX=1 -fwritable-strings @@ -114,7 +114,7 @@ noinst_PROGRAMS = stage2.exec e2fs_stage1_5.exec fat_stage1_5.exec \ MOSTLYCLEANFILES = $(noinst_PROGRAMS) STAGE2_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8000 -STAGE2_COMPILE = @STAGE2_CFLAGS@ -fno-builtin -nostdinc +STAGE2_COMPILE = $(STAGE2_CFLAGS) -fno-builtin -nostdinc STAGE1_5_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,2000 STAGE1_5_COMPILE = $(STAGE2_COMPILE) -DNO_DECOMPRESSION=1 -DSTAGE1_5=1 \ @@ -127,7 +127,7 @@ stage2_exec_SOURCES = asm.S boot.c common.c char_io.c cmdline.c \ disk_io.c gunzip.c stage2.c bios.c smp-imps.c fsys_ext2fs.c \ fsys_fat.c fsys_ffs.c fsys_minix.c -stage2_exec_CFLAGS = $(STAGE2_COMPILE) @FSYS_CFLAGS@ +stage2_exec_CFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS) stage2_exec_LDFLAGS = $(STAGE2_LINK) # For e2fs_stage1_5 target. diff --git a/stage2/boot.c b/stage2/boot.c index 1fa693c16..f832a69f5 100644 --- a/stage2/boot.c +++ b/stage2/boot.c @@ -39,7 +39,7 @@ static struct mod_list mll[99]; */ int -load_image (void) +load_image (char *kernel, char *arg) { int len, i, exec_type = 0, align_4k = 1, type = 0; unsigned long flags = 0, text_len = 0, data_len = 0, bss_len = 0; @@ -59,7 +59,7 @@ load_image (void) buffer by default */ pu.aout = (struct exec *) buffer; - if (!grub_open (cur_cmdline)) + if (!grub_open (kernel)) return 0; if (!(len = grub_read (buffer, MULTIBOOT_SEARCH)) || len < 32) @@ -213,7 +213,7 @@ load_image (void) char *vga; /* Find the substring "vga=". */ - vga = grub_strstr (cur_cmdline, "vga="); + vga = grub_strstr (arg, "vga="); if (vga) { char *value = vga + 4; @@ -250,7 +250,7 @@ load_image (void) /* copy command-line plus memory hack to staging area */ { - char *src = cur_cmdline; + char *src = arg; char *dest = (char *) (CL_MY_LOCATION + 4); memmove ((char *) CL_MY_LOCATION, "mem=", 4); @@ -290,7 +290,7 @@ load_image (void) return 0; /* fill the multiboot info structure */ - mbi.cmdline = (int) cur_cmdline; + mbi.cmdline = (int) arg; mbi.mods_count = 0; mbi.mods_addr = 0; mbi.boot_device = (saved_drive << 24) | saved_partition; @@ -473,14 +473,14 @@ load_image (void) } int -load_module (void) +load_module (char *module, char *arg) { int len; /* if we are supposed to load on 4K boundaries */ cur_addr = (cur_addr + 0xFFF) & 0xFFFFF000; - if (!grub_open (cur_cmdline) || !(len = grub_read ((char *) cur_addr, -1))) + if (!grub_open (module) || !(len = grub_read ((char *) cur_addr, -1))) return 0; printf (" [Multiboot-module @ 0x%x, 0x%x bytes]\n", cur_addr, len); @@ -489,7 +489,7 @@ load_module (void) mbi.flags |= MB_INFO_MODS; mbi.mods_addr = (int) mll; - mll[mbi.mods_count].cmdline = (int) cur_cmdline; + mll[mbi.mods_count].cmdline = (int) arg; mll[mbi.mods_count].mod_start = cur_addr; cur_addr += len; mll[mbi.mods_count].mod_end = cur_addr; @@ -502,12 +502,12 @@ load_module (void) } int -load_initrd (void) +load_initrd (char *initrd) { int len; long *ramdisk, moveto; - if (!grub_open (cur_cmdline) || !(len = grub_read ((char *) cur_addr, -1))) + if (! grub_open (initrd) || ! (len = grub_read ((char *) cur_addr, -1))) return 0; moveto = ((mbi.mem_upper + 0x400) * 0x400 - len) & 0xfffff000; @@ -532,7 +532,7 @@ load_initrd (void) void -bsd_boot (int type, int bootdev) +bsd_boot (int type, int bootdev, char *arg) { char *str; int clval = 0, i; @@ -540,8 +540,8 @@ bsd_boot (int type, int bootdev) stop_floppy (); - while (*(++cur_cmdline) && *cur_cmdline != ' '); - str = cur_cmdline; + while (*(++arg) && *arg != ' '); + str = arg; while (*str) { if (*str == '-') @@ -579,10 +579,10 @@ bsd_boot (int type, int bootdev) bi.bi_version = BOOTINFO_VERSION; - *cur_cmdline = 0; - while ((--cur_cmdline) > (char *) (mbi.cmdline) && *cur_cmdline != '/'); - if (*cur_cmdline == '/') - bi.bi_kernelname = cur_cmdline + 1; + *arg = 0; + while ((--arg) > (char *) MB_CMDLINE_BUF && *arg != '/'); + if (*arg == '/') + bi.bi_kernelname = arg + 1; else bi.bi_kernelname = 0; diff --git a/stage2/cmdline.c b/stage2/cmdline.c index 9b426d6eb..61b936e4f 100644 --- a/stage2/cmdline.c +++ b/stage2/cmdline.c @@ -68,7 +68,7 @@ char commands[] = " Possible commands are: \"pause= ...\", \"uppermem= \", \"root= \", \"rootnoverify= \", \"chainloader= \", \"kernel= ...\", \"testload= \", \"read= \", \"displaymem\", \"impsprobe\", - \"geometry= \", + \"geometry= \", \"hide= \", \"unhide= \", \"fstest\", \"debug\", \"module= ...\", \"modulenounzip= ...\", \"color= []\", \"makeactive\", \"boot\", \"quit\" and \"install= [d] [p] []\"\n"; @@ -117,7 +117,8 @@ enter_cmdline (char *script, char *heap) { int bootdev, cmd_len, type = 0, run_cmdline = 1, have_run_cmdline = 0; char *cur_heap = heap, *cur_entry = script, *old_entry; - + char *mb_cmdline = (char *) MB_CMDLINE_BUF; + /* initialization */ saved_drive = boot_drive; saved_partition = install_partition; @@ -185,20 +186,20 @@ returnit: if (run_cmdline && get_cmdline (PACKAGE "> ", commands, cur_heap, 2048, 0)) return CMDLINE_ERROR; - if (substring("boot", cur_heap) == 0 || (script && !*cur_heap)) + if (substring ("boot", cur_heap) == 0 || (script && !*cur_heap)) { if ((type == 'f') | (type == 'n')) - bsd_boot(type, bootdev); + bsd_boot (type, bootdev, (char *) MB_CMDLINE_BUF); if (type == 'l') - linux_boot(); + linux_boot (); if (type == 'L') - big_linux_boot(); + big_linux_boot (); if (type == 'c') { - gateA20(0); + gateA20 (0); boot_drive = saved_drive; - chain_stage1(0, BOOTSEC_LOCATION, BOOTSEC_LOCATION-16); + chain_stage1 (0, BOOTSEC_LOCATION, BOOTSEC_LOCATION-16); } if (!type) @@ -271,17 +272,21 @@ returnit: } } } - else if (substring("kernel", cur_heap) < 1) + else if (substring ("kernel", cur_heap) < 1) { - /* make sure it's at the beginning of the boot heap area */ - memmove (heap, cur_heap, - cmd_len + (((int)cur_cmdline) - ((int)cur_heap))); - cur_cmdline = heap + (((int)cur_cmdline) - ((int)cur_heap)); - cur_heap = heap; - if ((type = load_image()) != 0) - cur_heap = cur_cmdline + cmd_len; + /* Reset MB_CMDLINE. */ + mb_cmdline = (char *) MB_CMDLINE_BUF; + if (cmd_len + 1 > MB_CMDLINE_BUFLEN) + errnum = ERR_WONT_FIT; + else + { + /* Copy the command-line to MB_CMDLINE. */ + grub_memmove (mb_cmdline, cur_cmdline, cmd_len + 1); + if ((type = load_image (cur_cmdline, mb_cmdline)) != 0) + mb_cmdline += cmd_len + 1; + } } - else if (substring("module", cur_heap) < 1) + else if (substring ("module", cur_heap) < 1) { if (type == 'm') { @@ -291,17 +296,25 @@ returnit: if (cur_heap[6] == 'n') no_decompression = 1; #endif /* NO_DECOMPRESSION */ - - if (load_module()) - cur_heap = cur_cmdline + cmd_len; - + + if (mb_cmdline + cmd_len + 1 + > (char *) MB_CMDLINE_BUF + MB_CMDLINE_BUFLEN) + errnum = ERR_WONT_FIT; + else + { + /* Copy the command-line to MB_CMDLINE. */ + grub_memmove (mb_cmdline, cur_cmdline, cmd_len + 1); + if (load_module (cur_cmdline, mb_cmdline)) + mb_cmdline += cmd_len + 1; + } + #ifndef NO_DECOMPRESSION no_decompression = 0; #endif /* NO_DECOMPRESSION */ } else if (type == 'L' || type == 'l') { - load_initrd (); + load_initrd (cur_cmdline); } else errnum = ERR_NEED_MB_KERNEL; @@ -310,7 +323,7 @@ returnit: { if (type == 'L' || type == 'l') { - load_initrd (); + load_initrd (cur_cmdline); } else errnum = ERR_NEED_LX_KERNEL; @@ -693,6 +706,28 @@ returnit: } } } + else if (substring ("hide", cur_heap) < 1) + { + set_device (cur_cmdline); + + if (! errnum) + { + saved_partition = current_partition; + saved_drive = current_drive; + hide_partition (); + } + } + else if (substring ("unhide", cur_heap) < 1) + { + set_device (cur_cmdline); + + if (! errnum) + { + saved_partition = current_partition; + saved_drive = current_drive; + unhide_partition (); + } + } else if (*cur_heap && *cur_heap != ' ') errnum = ERR_UNRECOGNIZED; diff --git a/stage2/disk_io.c b/stage2/disk_io.c index d256e4c95..8aca807f7 100644 --- a/stage2/disk_io.c +++ b/stage2/disk_io.c @@ -311,6 +311,69 @@ make_saved_active (void) return 1; } +int +unhide_partition (void) +{ + if (saved_drive) + { + int part = saved_partition >> 16; + + if (part > 3) + { + errnum = ERR_NO_PART; + return 0; + } + + if (! rawread (saved_drive, 0, 0, SECTOR_SIZE, (char *) SCRATCHADDR)) + return 0; + + if (PC_SLICE_TYPE (SCRATCHADDR, part) & PC_SLICE_TYPE_HIDDEN_FLAG) + { + PC_SLICE_TYPE (SCRATCHADDR, part) ^= PC_SLICE_TYPE_HIDDEN_FLAG; + buf_track = -1; + if (biosdisk (BIOSDISK_WRITE, saved_drive, &buf_geom, + 0, 1, SCRATCHSEG)) + { + errnum = ERR_WRITE; + return 0; + } + } + } + + return 1; +} + +int +hide_partition (void) +{ + if (saved_drive) + { + int part = saved_partition >> 16; + + if (part > 3) + { + errnum = ERR_NO_PART; + return 0; + } + + if (! rawread (saved_drive, 0, 0, SECTOR_SIZE, (char *) SCRATCHADDR)) + return 0; + + if (! (PC_SLICE_TYPE (SCRATCHADDR, part) & PC_SLICE_TYPE_HIDDEN_FLAG)) + { + PC_SLICE_TYPE (SCRATCHADDR, part) |= PC_SLICE_TYPE_HIDDEN_FLAG; + buf_track = -1; + if (biosdisk (BIOSDISK_WRITE, saved_drive, &buf_geom, + 0, 1, SCRATCHSEG)) + { + errnum = ERR_WRITE; + return 0; + } + } + } + + return 1; +} static void check_and_print_mount (void) diff --git a/stage2/fsys_fat.c b/stage2/fsys_fat.c index 5b24c0067..c9ad9da0e 100644 --- a/stage2/fsys_fat.c +++ b/stage2/fsys_fat.c @@ -87,6 +87,7 @@ fat_create_blocklist (int first_fat_entry) BLK_BLKSTART (BLK_BLKLIST_START) = FAT_BPB_ROOT_DIR_START (BPB); fsmax = filemax = SECTOR_SIZE * (BLK_BLKLENGTH (BLK_BLKLIST_START) = FAT_BPB_ROOT_DIR_LENGTH (BPB)); + return 1; } else /* any real directory/file */ diff --git a/stage2/fsys_minix.c b/stage2/fsys_minix.c index 57c39b469..5a0646fb7 100644 --- a/stage2/fsys_minix.c +++ b/stage2/fsys_minix.c @@ -20,7 +20,7 @@ /* Restrictions: This is MINIX V1 only (yet) Disk creation is like: - mkfs.minix -c -n14 DEVICE + mkfs.minix -c DEVICE */ #ifdef FSYS_MINIX @@ -31,7 +31,7 @@ /* #define DEBUG_MINIX */ /* indirect blocks */ -static int mapblock1, mapblock2; +static int mapblock1, mapblock2, namelen; /* sizes are always in bytes, BLOCK values are always in DEV_BSIZE (sectors) */ #define DEV_BSIZE 512 @@ -80,8 +80,6 @@ typedef unsigned int __u32; here we have */ #define INODE_VERSION(inode) (SUPERBLOCK->s_version) -#define MINIX_NAME_LEN 14 /* XXX depend on version */ - /* * This is the original minix inode layout on disk. * Note the 8-bit gid and atime and ctime. @@ -162,19 +160,32 @@ struct minix_dir_entry { int minix_mount (void) { - int retval = 1; + if (((current_drive & 0x80 || current_slice != 0)) + && (current_slice != PC_SLICE_TYPE_MINIX) + && ! IS_PC_SLICE_TYPE_BSD_WITH_FS (current_slice, FS_OTHER)) + return 0; /* The partition is not of MINIX type */ + + if (part_length < (SBLOCK + + (sizeof (struct minix_super_block) / DEV_BSIZE))) + return 0; /* The partition is too short */ + + if (!devread (SBLOCK, 0, sizeof (struct minix_super_block), + (char *) SUPERBLOCK)) + return 0; /* Cannot read superblock */ + + switch (SUPERBLOCK->s_magic) + { + case MINIX_SUPER_MAGIC: + namelen = 14; + break; + case MINIX_SUPER_MAGIC2: + namelen = 30; + break; + default: + return 0; /* Unsupported type */ + } - if ((((current_drive & 0x80 || current_slice != 0)) - && (current_slice != PC_SLICE_TYPE_MINIX) - && ! IS_PC_SLICE_TYPE_BSD_WITH_FS (current_slice, FS_OTHER)) - || part_length < (SBLOCK + - (sizeof (struct minix_super_block) / DEV_BSIZE)) - || ! devread (SBLOCK, 0, sizeof (struct minix_super_block), - (char *) SUPERBLOCK) - || SUPERBLOCK->s_magic != MINIX_SUPER_MAGIC) - retval = 0; - - return retval; + return 1; } /* Takes a file system block number and reads it into BUFFER. */ @@ -482,9 +493,10 @@ minix_dir (char *dirname) off = loc & (BLOCK_SIZE - 1); dp = (struct minix_dir_entry *) (DATABLOCK2 + off); /* advance loc prematurely to next on-disk directory entry */ - loc += sizeof (dp->inode) + 14; /* XXX */ + loc += sizeof (dp->inode) + namelen; - /* NOTE: minix filenames are NULL terminated if < 14 else exact */ + /* NOTE: minix filenames are NULL terminated if < NAMELEN + else exact */ #ifdef DEBUG_MINIX printf ("directory entry ino=%d\n", dp->inode); @@ -494,9 +506,9 @@ minix_dir (char *dirname) if (dp->inode) { - int saved_c = dp->name[MINIX_NAME_LEN+1]; + int saved_c = dp->name[namelen + 1]; - dp->name[MINIX_NAME_LEN+1] = 0; + dp->name[namelen+1] = 0; str_chk = substring (dirname, dp->name); # ifndef STAGE1_5 @@ -509,7 +521,7 @@ minix_dir (char *dirname) } # endif - dp->name[MINIX_NAME_LEN+1] = saved_c; + dp->name[namelen + 1] = saved_c; } } diff --git a/stage2/pc_slice.h b/stage2/pc_slice.h index c6a77b324..05f815081 100644 --- a/stage2/pc_slice.h +++ b/stage2/pc_slice.h @@ -133,6 +133,8 @@ #define IS_PC_SLICE_TYPE_BSD(type) IS_PC_SLICE_TYPE_BSD_WITH_FS(type,0) +/* This is not a flag actually, but used as if it were a flag. */ +#define PC_SLICE_TYPE_HIDDEN_FLAG 0x10 /* * *BSD-style disklabel & partition definitions. diff --git a/stage2/shared.h b/stage2/shared.h index 96deecbdd..28fef24ce 100644 --- a/stage2/shared.h +++ b/stage2/shared.h @@ -68,6 +68,12 @@ extern char *grub_scratch_mem; #define FSYS_BUFLEN 0x8000 #define FSYS_BUF RAW_ADDR (0x68000) +/* Command-line buffer for Multiboot kernels and modules. This area + includes the area into which Stage 1.5 and Stage 1 are loaded, but + that's no problem. */ +#define MB_CMDLINE_BUF RAW_ADDR (0x2000) +#define MB_CMDLINE_BUFLEN 0x6000 + /* * Linux setup parameters */ @@ -546,6 +552,12 @@ int open_partition (void); /* Sets device to the one represented by the SAVED_* parameters. */ int make_saved_active (void); +/* Hide a partition. */ +int hide_partition (void); + +/* Unhide a partition. */ +int unhide_partition (void); + /* Open a file or directory on the active device, using GRUB's internal filesystem support. */ int grub_open (char *filename); @@ -570,10 +582,10 @@ void print_completions (char *filename); /* Copies the current partition data to the desired address. */ void copy_current_part_entry (char *buf); -void bsd_boot (int type, int bootdev) __attribute__ ((noreturn)); -int load_image (void); -int load_module (void); -int load_initrd (void); +void bsd_boot (int type, int bootdev, char *arg) __attribute__ ((noreturn)); +int load_image (char *kernel, char *arg); +int load_module (char *module, char *arg); +int load_initrd (char *initrd); void init_bios_info (void);