add a new command, blocklist.

This commit is contained in:
okuji 1999-12-30 08:21:08 +00:00
parent 161b9f4dde
commit 372831bc72
4 changed files with 94 additions and 0 deletions

View file

@ -1,3 +1,11 @@
1999-12-30 OKUJI Yoshinori <okuji@gnu.org>
* stage2/builtins.c (blocklist_func): New function.
(builtin_blocklist): New variable.
(builtin_table): Added a pointer to BUILTIN_BLOCKLIST.
* docs/user-ref.texi (Command-line-specific commands): Added a
description about the command "blocklist".
1999-12-30 OKUJI Yoshinori <okuji@gnu.org>
* stage2/disk_io.c (grub_seek): New function.

1
NEWS
View file

@ -26,6 +26,7 @@ New in 0.5.94:
* The command "install" can now patch a Stage 2 with a different
filename from "/boot/grub/menu.lst" even if a Stage 1.5 is used.
* New program, ``grub-install''.
* The command "blocklist" prints the blocklist notation of a file.
New in 0.5.93 - 1999-10-30:
* ELF format of FreeBSD kernel is supported.

View file

@ -738,6 +738,11 @@ partitions exist in one disk.
These commands are usable only in the command line and in menu entries.
If you forget some command, run the command @command{help}.
@deffn Command blocklist file
Print the blocklist notation of the file @var{file} (@pxref{Blocklist
syntax}).
@end deffn
@deffn Command boot
This boots the OS/chain-loader which has been loaded. Only necessary if
running the fully interactive command line (it is implicit at the end of

View file

@ -79,6 +79,85 @@ disk_read_print_func (int sector)
}
/* blocklist */
static int
blocklist_func (char *arg, int flags)
{
char *dummy = (char *) RAW_ADDR (0x100000);
int start_sector;
int num_sectors = 0;
int num_entries = 0;
/* Collect contiguous blocks into one entry as many as possible,
and print the blocklist notation on the screen. */
static void disk_read_blocklist_func (int sector)
{
if (debug)
grub_printf ("[%d]", sector);
if (num_sectors > 0)
{
if (start_sector + num_sectors == sector)
num_sectors++;
else
{
grub_printf ("%s%d+%d", num_entries ? "," : "",
start_sector - part_start, num_sectors);
num_entries++;
num_sectors = 0;
}
}
else
{
start_sector = sector;
num_sectors = 1;
}
}
/* Open the file. */
if (! grub_open (arg))
return 1;
/* Print the device name. */
grub_printf ("(%cd%d",
(current_drive & 0x80) ? 'h' : 'f',
current_drive & ~0x80);
if ((current_partition & 0xFF0000) != 0xFF0000)
grub_printf (",%d", (current_partition >> 16) & 0xFF);
if ((current_partition & 0x00FF00) != 0x00FF00)
grub_printf (",%c", 'a' + ((current_partition >> 8) & 0xFF));
grub_printf (")");
/* Read in the whole file to DUMMY. */
disk_read_hook = disk_read_blocklist_func;
if (! grub_read (dummy, -1))
goto fail;
/* The last entry may not be printed yet. */
if (num_sectors > 0)
grub_printf ("%s%d+%d", num_entries ? "," : "",
start_sector - part_start, num_sectors);
grub_printf ("\n");
fail:
disk_read_hook = 0;
grub_close ();
return errnum;
}
static struct builtin builtin_blocklist =
{
"blocklist",
blocklist_func,
BUILTIN_CMDLINE,
"blocklist FILE",
"Print the blocklist notation of the file FILE."
};
/* boot */
static int
boot_func (char *arg, int flags)
@ -2603,6 +2682,7 @@ static struct builtin builtin_uppermem =
/* The table of builtin commands. Sorted in dictionary order. */
struct builtin *builtin_table[] =
{
&builtin_blocklist,
&builtin_boot,
&builtin_cat,
&builtin_chainloader,