fix some bugs in builtin commands and add the command find.

This commit is contained in:
okuji 1999-10-19 12:28:35 +00:00
parent 28f2016a13
commit 19c9df87bc
3 changed files with 136 additions and 15 deletions

View file

@ -1,3 +1,15 @@
1999-10-19 OKUJI Yoshinori <okuji@kuicr.kyoto-u.ac.jp>
* stage2/builtins.c (find_func): New function.
(builtin_find): New variable.
(hide_func): Save SAVED_DRIVE and SAVED_PARTITION to TMP_DRIVE
and TMP_PARTITION, respectively, and resotre them before return.
(unhide_func): Likewise.
(setup_func): Likewise. And set SAVED_DRIVE and SAVED_PARTITION
instead of CURRENT_DRIVE and CURRENT_PARTITION to IMAGE_DRIVE
and IMAGE_PARTITION before running install_func.
(builtin_table): Added a pointer to BUILTIN_FIND.
1999-10-19 OKUJI Yoshinori <okuji@kuicr.kyoto-u.ac.jp>
* docs/Makefile.am (UNFINISHED_MANUALS): New variable.

View file

@ -96,7 +96,7 @@ edition documents version @value{VERSION}.
Part I: The Tutorial Manual
* Overview::
* Device syntax::
* Device Syntax::
* Installation::
* Boot::
* Configuration::

View file

@ -654,6 +654,87 @@ static struct builtin builtin_fallback =
#endif
};
/* find */
/* Search for the filename ARG in all of partitions. */
static int
find_func (char *arg, int flags)
{
char *filename = arg;
unsigned long drive;
unsigned long tmp_drive = saved_drive;
unsigned long tmp_partition = saved_partition;
/* Floppies. */
for (drive = 0; drive < 8; drive++)
{
current_drive = drive;
current_partition = 0xFFFFFF;
if (! open_device ())
continue;
saved_drive = current_drive;
saved_partition = current_partition;
if (grub_open (filename))
grub_printf ("(fd%d)%s\n", drive, filename);
}
/* Hard disks. */
for (drive = 0x80; drive < 0x88; drive++)
{
unsigned long slice;
current_drive = drive;
/* FIXME: is what maximum number right? */
for (slice = 0; slice < 12; slice++)
{
current_partition = (slice << 16) | 0xFFFF;
if (! open_device () && IS_PC_SLICE_TYPE_BSD (current_slice))
{
unsigned long part;
for (part = 0; part < 8; part++)
{
current_partition = (slice << 16) | (part << 8) | 0xFF;
if (! open_device ())
continue;
saved_drive = current_drive;
saved_partition = current_partition;
if (grub_open (filename))
grub_printf ("(hd%d,%d,%c)%s",
drive - 0x80,
slice,
part + 'a',
filename);
}
}
else
{
saved_drive = current_drive;
saved_partition = current_partition;
if (grub_open (filename))
grub_printf ("(hd%d,%d)%s", drive - 0x80, slice, filename);
}
}
}
errnum = 0;
saved_drive = tmp_drive;
saved_partition = tmp_partition;
return 0;
}
static struct builtin builtin_find =
{
"find",
find_func,
BUILTIN_CMDLINE,
"find FILENAME",
"Search for the filename FILENAME in all of partitions."
};
/* fstest */
static int
@ -886,14 +967,23 @@ static struct builtin builtin_help =
static int
hide_func (char *arg, int flags)
{
unsigned long tmp_drive = saved_drive;
unsigned long tmp_partition = saved_partition;
if (! set_device (arg))
return 1;
saved_partition = current_partition;
saved_drive = current_drive;
if (! set_partition_hidden_flag (1))
return 1;
{
saved_drive = tmp_drive;
saved_partition = tmp_partition;
return 1;
}
saved_drive = tmp_drive;
saved_partition = tmp_partition;
return 0;
}
@ -1609,8 +1699,9 @@ setup_func (char *arg, int flags)
/* Point to the string of the drive/parition where the GRUB images
reside. */
char *image_ptr;
int install_drive, install_partition;
int image_drive, image_partition;
unsigned long install_drive, install_partition;
unsigned long image_drive, image_partition;
unsigned long tmp_drive, tmp_partition;
char stage1[64];
char stage2[64];
char config_file[64];
@ -1654,6 +1745,9 @@ setup_func (char *arg, int flags)
grub_strcpy (stage2, "/boot/grub/stage2");
grub_strcpy (config_file, "/boot/grub/menu.lst");
tmp_drive = saved_drive;
tmp_partition = saved_partition;
install_ptr = arg;
image_ptr = skip_to (0, install_ptr);
@ -1681,18 +1775,18 @@ setup_func (char *arg, int flags)
current_partition = saved_partition;
}
image_drive = current_drive;
image_partition = current_partition;
image_drive = saved_drive = current_drive;
image_partition = saved_partition = current_partition;
/* Open it. */
if (! open_device ())
return 1;
goto fail;
/* Check for stage1 and stage2. We hardcode the filenames, so
if the user installed GRUB in a uncommon directory, this never
succeed. */
if (! grub_open (stage1) || ! grub_open (stage2))
return 1;
goto fail;
/* If the drive where stage2 resides is a hard disk, try to use a
Stage 1.5. */
@ -1768,13 +1862,18 @@ setup_func (char *arg, int flags)
/* Notify what will be run. */
grub_printf (" Run \"install %s\"\n", cmd_arg);
/* Make sure that CURRENT_DRIVE and CURRENT_PARTITION are identical
/* Make sure that SAVED_DRIVE and SAVED_PARTITION are identical
with IMAGE_DRIVE and IMAGE_PARTITION, respectively. */
current_drive = image_drive;
current_partition = image_partition;
saved_drive = image_drive;
saved_partition = image_partition;
/* Run the command. */
return install_func (cmd_arg, flags);
install_func (cmd_arg, flags);
fail:
saved_drive = tmp_drive;
saved_partition = tmp_partition;
return errnum;
}
static struct builtin builtin_setup =
@ -1927,14 +2026,23 @@ static struct builtin builtin_title =
static int
unhide_func (char *arg, int flags)
{
unsigned long tmp_drive = saved_drive;
unsigned long tmp_partition = saved_partition;
if (! set_device (arg))
return 1;
saved_partition = current_partition;
saved_drive = current_drive;
if (! set_partition_hidden_flag (0))
return 1;
{
saved_drive = tmp_drive;
saved_partition = tmp_partition;
return 1;
}
saved_drive = tmp_drive;
saved_partition = tmp_partition;
return 0;
}
@ -1985,6 +2093,7 @@ struct builtin *builtin_table[] =
&builtin_displaymem,
&builtin_embed,
&builtin_fallback,
&builtin_find,
&builtin_fstest,
&builtin_geometry,
&builtin_help,