File stage2-dir-callback.diff of Package grub
Index: grub-0.95/stage2/fsys_jfs.c
===================================================================
--- grub-0.95.orig/stage2/fsys_jfs.c
+++ grub-0.95/stage2/fsys_jfs.c
@@ -270,7 +270,7 @@ jfs_read (char *buf, int len)
}
int
-jfs_dir (char *dirname)
+jfs_dir (char *dirname, void (*handle)(char *))
{
char *ptr, *rest, ch;
ldtentry_t *de;
@@ -357,12 +357,9 @@ jfs_dir (char *dirname)
cmp = (!*dirname) ? -1 : substring (dirname, namebuf);
#ifndef STAGE1_5
- if (print_possibilities && ch != '/'
- && cmp <= 0) {
- if (print_possibilities > 0)
- print_possibilities = -print_possibilities;
- print_a_completion (namebuf);
- } else
+ if (handle && ch != '/' && cmp <= 0)
+ handle (namebuf);
+ else
#endif
if (cmp == 0) {
parent_inum = inum;
@@ -372,9 +369,6 @@ jfs_dir (char *dirname)
}
de = next_dentry ();
if (de == NULL) {
- if (print_possibilities < 0)
- return 1;
-
errnum = ERR_FILE_NOT_FOUND;
*rest = ch;
return 0;
Index: grub-0.95/stage2/fsys_minix.c
===================================================================
--- grub-0.95.orig/stage2/fsys_minix.c
+++ grub-0.95/stage2/fsys_minix.c
@@ -294,7 +294,7 @@ minix_read (char *buf, int len)
inode of the file we were trying to look up
side effects: none yet */
int
-minix_dir (char *dirname)
+minix_dir (char *dirname, void (*handle)(char *))
{
int current_ino = MINIX_ROOT_INO; /* start at the root */
int updir_ino = current_ino; /* the parent of the current directory */
@@ -457,18 +457,9 @@ minix_dir (char *dirname)
give up */
if (loc >= INODE->i_size)
{
- if (print_possibilities < 0)
- {
-#if 0
- putchar ('\n');
-#endif
- }
- else
- {
- errnum = ERR_FILE_NOT_FOUND;
- *rest = ch;
- }
- return (print_possibilities < 0);
+ errnum = ERR_FILE_NOT_FOUND;
+ *rest = ch;
+ return 0;
}
/* else, find the (logical) block component of our location */
@@ -510,20 +501,15 @@ minix_dir (char *dirname)
str_chk = substring (dirname, dp->name);
# ifndef STAGE1_5
- if (print_possibilities && ch != '/'
- && (!*dirname || str_chk <= 0))
- {
- if (print_possibilities > 0)
- print_possibilities = -print_possibilities;
- print_a_completion (dp->name);
- }
+ if (handle && ch != '/' && (!*dirname || str_chk <= 0))
+ handle (dp->name);
# endif
dp->name[namelen] = saved_c;
}
}
- while (!dp->inode || (str_chk || (print_possibilities && ch != '/')));
+ while (!dp->inode || (str_chk || (handle && ch != '/')));
current_ino = dp->inode;
*(dirname = rest) = ch;
Index: grub-0.95/stage2/fsys_reiserfs.c
===================================================================
--- grub-0.95.orig/stage2/fsys_reiserfs.c
+++ grub-0.95/stage2/fsys_reiserfs.c
@@ -991,7 +991,7 @@ reiserfs_read (char *buf, int len)
* the size of the file.
*/
int
-reiserfs_dir (char *dirname)
+reiserfs_dir (char *dirname, void (*handle)(char *))
{
struct reiserfs_de_head *de_head;
char *rest, ch;
@@ -1123,7 +1123,7 @@ reiserfs_dir (char *dirname)
*rest = 0;
# ifndef STAGE1_5
- if (print_possibilities && ch != '/')
+ if (handle && ch != '/')
do_possibilities = 1;
# endif /* ! STAGE1_5 */
@@ -1170,10 +1170,8 @@ reiserfs_dir (char *dirname)
{
if (cmp <= 0)
{
- if (print_possibilities > 0)
- print_possibilities = -print_possibilities;
*name_end = 0;
- print_a_completion (filename);
+ handle (filename);
*name_end = tmp;
}
}
@@ -1189,12 +1187,6 @@ reiserfs_dir (char *dirname)
num_entries--;
}
}
-
-# ifndef STAGE1_5
- if (print_possibilities < 0)
- return 1;
-# endif /* ! STAGE1_5 */
-
errnum = ERR_FILE_NOT_FOUND;
*rest = ch;
return 0;
Index: grub-0.95/stage2/fsys_iso9660.c
===================================================================
--- grub-0.95.orig/stage2/fsys_iso9660.c
+++ grub-0.95/stage2/fsys_iso9660.c
@@ -133,7 +133,7 @@ iso9660_mount (void)
}
int
-iso9660_dir (char *dirname)
+iso9660_dir (char *dirname, void (*handle)(char *))
{
struct iso_directory_record *idr;
RR_ptr_t rr_ptr;
@@ -346,7 +346,7 @@ iso9660_dir (char *dirname)
if (name_len >= pathlen
&& !memcmp(name, dirname, pathlen))
{
- if (dirname[pathlen] == '/' || !print_possibilities)
+ if (dirname[pathlen] == '/' || !handle)
{
/*
* DIRNAME is directory component of pathname,
@@ -377,11 +377,9 @@ iso9660_dir (char *dirname)
else /* Completion */
{
#ifndef STAGE1_5
- if (print_possibilities > 0)
- print_possibilities = -print_possibilities;
memcpy(NAME_BUF, name, name_len);
NAME_BUF[name_len] = '\0';
- print_a_completion (NAME_BUF);
+ handle (NAME_BUF);
#endif
}
}
@@ -390,7 +388,7 @@ iso9660_dir (char *dirname)
size -= ISO_SECTOR_SIZE;
} /* size>0 */
- if (dirname[pathlen] == '/' || print_possibilities >= 0)
+ if (dirname[pathlen] == '/' || handle)
{
errnum = ERR_FILE_NOT_FOUND;
return 0;
Index: grub-0.95/stage2/fsys_fat.c
===================================================================
--- grub-0.95.orig/stage2/fsys_fat.c
+++ grub-0.95/stage2/fsys_fat.c
@@ -286,7 +286,7 @@ fat_read (char *buf, int len)
}
int
-fat_dir (char *dirname)
+fat_dir (char *dirname, void (*handle)(char *))
{
char *rest, ch, dir_buf[FAT_DIRENTRY_LENGTH];
char *filename = (char *) NAME_BUF;
@@ -342,7 +342,7 @@ fat_dir (char *dirname)
*rest = 0;
# ifndef STAGE1_5
- if (print_possibilities && ch != '/')
+ if (handle && ch != '/')
do_possibilities = 1;
# endif
@@ -353,16 +353,6 @@ fat_dir (char *dirname)
{
if (!errnum)
{
-# ifndef STAGE1_5
- if (print_possibilities < 0)
- {
-#if 0
- putchar ('\n');
-#endif
- return 1;
- }
-# endif /* STAGE1_5 */
-
errnum = ERR_FILE_NOT_FOUND;
*rest = ch;
}
@@ -457,11 +447,7 @@ fat_dir (char *dirname)
{
print_filename:
if (substring (dirname, filename) <= 0)
- {
- if (print_possibilities > 0)
- print_possibilities = -print_possibilities;
- print_a_completion (filename);
- }
+ handle (filename);
continue;
}
# endif /* STAGE1_5 */
Index: grub-0.95/stage2/filesys.h
===================================================================
--- grub-0.95.orig/stage2/filesys.h
+++ grub-0.95/stage2/filesys.h
@@ -24,7 +24,7 @@
#define FSYS_FFS_NUM 1
int ffs_mount (void);
int ffs_read (char *buf, int len);
-int ffs_dir (char *dirname);
+int ffs_dir (char *dirname, void (*handle)(char *));
int ffs_embed (int *start_sector, int needed_sectors);
#else
#define FSYS_FFS_NUM 0
@@ -34,7 +34,7 @@ int ffs_embed (int *start_sector, int ne
#define FSYS_UFS2_NUM 1
int ufs2_mount (void);
int ufs2_read (char *buf, int len);
-int ufs2_dir (char *dirname);
+int ufs2_dir (char *dirname, void (*handle)(char *));
int ufs2_embed (int *start_sector, int needed_sectors);
#else
#define FSYS_UFS2_NUM 0
@@ -44,7 +44,7 @@ int ufs2_embed (int *start_sector, int n
#define FSYS_FAT_NUM 1
int fat_mount (void);
int fat_read (char *buf, int len);
-int fat_dir (char *dirname);
+int fat_dir (char *dirname, void (*handle)(char *));
#else
#define FSYS_FAT_NUM 0
#endif
@@ -53,7 +53,7 @@ int fat_dir (char *dirname);
#define FSYS_EXT2FS_NUM 1
int ext2fs_mount (void);
int ext2fs_read (char *buf, int len);
-int ext2fs_dir (char *dirname);
+int ext2fs_dir (char *dirname, void (*handle)(char *));
#else
#define FSYS_EXT2FS_NUM 0
#endif
@@ -62,7 +62,7 @@ int ext2fs_dir (char *dirname);
#define FSYS_MINIX_NUM 1
int minix_mount (void);
int minix_read (char *buf, int len);
-int minix_dir (char *dirname);
+int minix_dir (char *dirname, void (*handle)(char *));
#else
#define FSYS_MINIX_NUM 0
#endif
@@ -71,7 +71,7 @@ int minix_dir (char *dirname);
#define FSYS_REISERFS_NUM 1
int reiserfs_mount (void);
int reiserfs_read (char *buf, int len);
-int reiserfs_dir (char *dirname);
+int reiserfs_dir (char *dirname, void (*handle)(char *));
int reiserfs_embed (int *start_sector, int needed_sectors);
#else
#define FSYS_REISERFS_NUM 0
@@ -81,7 +81,7 @@ int reiserfs_embed (int *start_sector, i
#define FSYS_VSTAFS_NUM 1
int vstafs_mount (void);
int vstafs_read (char *buf, int len);
-int vstafs_dir (char *dirname);
+int vstafs_dir (char *dirname, void (*handle)(char *));
#else
#define FSYS_VSTAFS_NUM 0
#endif
@@ -90,7 +90,7 @@ int vstafs_dir (char *dirname);
#define FSYS_JFS_NUM 1
int jfs_mount (void);
int jfs_read (char *buf, int len);
-int jfs_dir (char *dirname);
+int jfs_dir (char *dirname, void (*handle)(char *));
int jfs_embed (int *start_sector, int needed_sectors);
#else
#define FSYS_JFS_NUM 0
@@ -100,7 +100,7 @@ int jfs_embed (int *start_sector, int ne
#define FSYS_XFS_NUM 1
int xfs_mount (void);
int xfs_read (char *buf, int len);
-int xfs_dir (char *dirname);
+int xfs_dir (char *dirname, void (*handle)(char *));
#else
#define FSYS_XFS_NUM 0
#endif
@@ -109,7 +109,7 @@ int xfs_dir (char *dirname);
#define FSYS_TFTP_NUM 1
int tftp_mount (void);
int tftp_read (char *buf, int len);
-int tftp_dir (char *dirname);
+int tftp_dir (char *dirname, void (*handle)(char *));
void tftp_close (void);
#else
#define FSYS_TFTP_NUM 0
@@ -119,7 +119,7 @@ void tftp_close (void);
#define FSYS_ISO9660_NUM 1
int iso9660_mount (void);
int iso9660_read (char *buf, int len);
-int iso9660_dir (char *dirname);
+int iso9660_dir (char *dirname, void (*handle)(char *));
#else
#define FSYS_ISO9660_NUM 0
#endif
@@ -150,16 +150,10 @@ struct fsys_entry
char *name;
int (*mount_func) (void);
int (*read_func) (char *buf, int len);
- int (*dir_func) (char *dirname);
+ int (*dir_func) (char *dirname, void (*print_one)(char *));
void (*close_func) (void);
int (*embed_func) (int *start_sector, int needed_sectors);
};
-#ifdef STAGE1_5
-# define print_possibilities 0
-#else
-extern int print_possibilities;
-#endif
-
extern int fsmax;
extern struct fsys_entry fsys_table[NUM_FSYS + 1];
Index: grub-0.95/stage2/fsys_ext2fs.c
===================================================================
--- grub-0.95.orig/stage2/fsys_ext2fs.c
+++ grub-0.95/stage2/fsys_ext2fs.c
@@ -491,7 +491,7 @@ int ext2_is_fast_symlink (void)
* side effects: messes up GROUP_DESC buffer area
*/
int
-ext2fs_dir (char *dirname)
+ext2fs_dir (char *dirname, void (*handle)(char *))
{
int current_ino = EXT2_ROOT_INO; /* start at the root */
int updir_ino = current_ino; /* the parent of the current directory */
@@ -517,7 +517,6 @@ ext2fs_dir (char *dirname)
#ifdef E2DEBUG
unsigned char *i;
#endif /* E2DEBUG */
-
/* loop invariants:
current_ino = inode to lookup
dirname = pointer to filename component we are cur looking up within
@@ -709,18 +708,9 @@ ext2fs_dir (char *dirname)
give up */
if (loc >= INODE->i_size)
{
- if (print_possibilities < 0)
- {
-# if 0
- putchar ('\n');
-# endif
- }
- else
- {
- errnum = ERR_FILE_NOT_FOUND;
- *rest = ch;
- }
- return (print_possibilities < 0);
+ errnum = ERR_FILE_NOT_FOUND;
+ *rest = ch;
+ return 0;
}
/* else, find the (logical) block component of our location */
@@ -761,20 +751,15 @@ ext2fs_dir (char *dirname)
str_chk = substring (dirname, dp->name);
# ifndef STAGE1_5
- if (print_possibilities && ch != '/'
- && (!*dirname || str_chk <= 0))
- {
- if (print_possibilities > 0)
- print_possibilities = -print_possibilities;
- print_a_completion (dp->name);
- }
+ if (handle && ch != '/' && (!*dirname || str_chk <= 0))
+ handle (dp->name);
# endif
dp->name[dp->name_len] = saved_c;
}
}
- while (!dp->inode || (str_chk || (print_possibilities && ch != '/')));
+ while (!dp->inode || (str_chk || (handle && ch != '/')));
current_ino = dp->inode;
*(dirname = rest) = ch;
Index: grub-0.95/stage2/fsys_ffs.c
===================================================================
--- grub-0.95.orig/stage2/fsys_ffs.c
+++ grub-0.95/stage2/fsys_ffs.c
@@ -180,7 +180,7 @@ ffs_read (char *buf, int len)
int
-ffs_dir (char *dirname)
+ffs_dir (char *dirname, void (*handle)(char *))
{
char *rest, ch;
int block, off, loc, map, ino = ROOTINO;
@@ -236,13 +236,6 @@ loop:
{
if (loc >= INODE->i_size)
{
-#if 0
- putchar ('\n');
-#endif
-
- if (print_possibilities < 0)
- return 1;
-
errnum = ERR_FILE_NOT_FOUND;
*rest = ch;
return 0;
@@ -267,18 +260,13 @@ loop:
loc += dp->d_reclen;
#ifndef STAGE1_5
- if (dp->d_ino && print_possibilities && ch != '/'
+ if (dp->d_ino && handle && ch != '/'
&& (!*dirname || substring (dirname, dp->d_name) <= 0))
- {
- if (print_possibilities > 0)
- print_possibilities = -print_possibilities;
-
- print_a_completion (dp->d_name);
- }
+ handle (dp->d_name);
#endif /* STAGE1_5 */
}
while (!dp->d_ino || (substring (dirname, dp->d_name) != 0
- || (print_possibilities && ch != '/')));
+ || (handle && ch != '/')));
/* only get here if we have a matching directory entry */
Index: grub-0.95/stage2/fsys_vstafs.c
===================================================================
--- grub-0.95.orig/stage2/fsys_vstafs.c
+++ grub-0.95/stage2/fsys_vstafs.c
@@ -115,7 +115,7 @@ vstafs_nextdir (void)
}
int
-vstafs_dir (char *dirname)
+vstafs_dir (char *dirname, void (*handle)(char *))
{
char *fn, ch;
struct dir_entry *d;
@@ -146,14 +146,9 @@ vstafs_dir (char *dirname)
continue;
#ifndef STAGE1_5
- if (print_possibilities && ch != '/'
+ if (handle && ch != '/'
&& (! *dirname || strcmp (dirname, d->name) <= 0))
- {
- if (print_possibilities > 0)
- print_possibilities = -print_possibilities;
-
- printf (" %s", d->name);
- }
+ handle(d->name);
#endif
if (! grub_strcmp (dirname, d->name))
{
@@ -168,12 +163,6 @@ vstafs_dir (char *dirname)
*(dirname = fn) = ch;
if (! d)
{
- if (print_possibilities < 0)
- {
- putchar ('\n');
- return 1;
- }
-
errnum = ERR_FILE_NOT_FOUND;
return 0;
}
Index: grub-0.95/stage2/fsys_ufs2.c
===================================================================
--- grub-0.95.orig/stage2/fsys_ufs2.c
+++ grub-0.95/stage2/fsys_ufs2.c
@@ -204,7 +204,7 @@ ufs2_read (char *buf, int len)
}
int
-ufs2_dir (char *dirname)
+ufs2_dir (char *dirname, void (*handle)(char *))
{
char *rest, ch;
int block, off, loc, ino = ROOTINO;
@@ -261,9 +261,6 @@ loop:
{
if (loc >= INODE_UFS2->di_size)
{
- if (print_possibilities < 0)
- return 1;
-
errnum = ERR_FILE_NOT_FOUND;
*rest = ch;
return 0;
@@ -288,18 +285,13 @@ loop:
loc += dp->d_reclen;
#ifndef STAGE1_5
- if (dp->d_ino && print_possibilities && ch != '/'
+ if (dp->d_ino && handle && ch != '/'
&& (!*dirname || substring (dirname, dp->d_name) <= 0))
- {
- if (print_possibilities > 0)
- print_possibilities = -print_possibilities;
-
- print_a_completion (dp->d_name);
- }
+ handle (dp->d_name);
#endif /* STAGE1_5 */
}
while (!dp->d_ino || (substring (dirname, dp->d_name) != 0
- || (print_possibilities && ch != '/')));
+ || (handle && ch != '/')));
/* only get here if we have a matching directory entry */
Index: grub-0.95/stage2/disk_io.c
===================================================================
--- grub-0.95.orig/stage2/disk_io.c
+++ grub-0.95/stage2/disk_io.c
@@ -36,7 +36,6 @@ void (*disk_read_hook) (int, int, int) =
void (*disk_read_func) (int, int, int) = NULL;
#ifndef STAGE1_5
-int print_possibilities;
static int do_completion;
static int unique;
@@ -1479,7 +1478,7 @@ print_completions (int is_filename, int
if (! is_completion)
grub_printf (" Possible files are:");
- dir (buf);
+ dir (buf, print_a_completion);
if (is_completion && *unique_string)
{
@@ -1498,7 +1497,7 @@ print_completions (int is_filename, int
*ptr = '/';
*(ptr + 1) = 0;
- dir (buf);
+ dir (buf, print_a_completion);
/* Restore the original unique value. */
unique = 1;
@@ -1626,12 +1625,7 @@ grub_open (char *filename)
if (!errnum && fsys_type == NUM_FSYS)
errnum = ERR_FSYS_MOUNT;
-# ifndef STAGE1_5
- /* set "dir" function to open a file */
- print_possibilities = 0;
-# endif
-
- if (!errnum && (*(fsys_table[fsys_type].dir_func)) (filename))
+ if (!errnum && (*(fsys_table[fsys_type].dir_func)) (filename, NULL))
{
#ifndef NO_DECOMPRESSION
return gunzip_test_header ();
@@ -1752,7 +1746,7 @@ grub_seek (int offset)
}
int
-dir (char *dirname)
+dir (char *dirname, void (*handle)(char *))
{
#ifndef NO_DECOMPRESSION
compressed_file = 0;
@@ -1761,19 +1755,18 @@ dir (char *dirname)
if (!(dirname = setup_part (dirname)))
return 0;
+ errnum = 0;
if (*dirname != '/')
errnum = ERR_BAD_FILENAME;
-
- if (fsys_type == NUM_FSYS)
+ else if (fsys_type == NUM_FSYS)
errnum = ERR_FSYS_MOUNT;
-
- if (errnum)
- return 0;
-
- /* set "dir" function to list completions */
- print_possibilities = 1;
-
- return (*(fsys_table[fsys_type].dir_func)) (dirname);
+ else
+ {
+ fsys_table[fsys_type].dir_func (dirname, handle);
+ if (errnum == ERR_FILE_NOT_FOUND)
+ errnum = 0;
+ }
+ return errnum == 0;
}
#endif /* STAGE1_5 */
Index: grub-0.95/stage2/fsys_xfs.c
===================================================================
--- grub-0.95.orig/stage2/fsys_xfs.c
+++ grub-0.95/stage2/fsys_xfs.c
@@ -534,7 +534,7 @@ xfs_read (char *buf, int len)
}
int
-xfs_dir (char *dirname)
+xfs_dir (char *dirname, void (*handle)(char *))
{
xfs_ino_t ino, parent_ino, new_ino;
xfs_fsize_t di_size;
@@ -595,11 +595,9 @@ xfs_dir (char *dirname)
for (;;) {
cmp = (!*dirname) ? -1 : substring (dirname, name);
#ifndef STAGE1_5
- if (print_possibilities && ch != '/' && cmp <= 0) {
- if (print_possibilities > 0)
- print_possibilities = -print_possibilities;
- print_a_completion (name);
- } else
+ if (handle && ch != '/' && cmp <= 0)
+ handle (name);
+ else
#endif
if (cmp == 0) {
parent_ino = ino;
@@ -610,9 +608,6 @@ xfs_dir (char *dirname)
}
name = next_dentry (&new_ino);
if (name == NULL) {
- if (print_possibilities < 0)
- return 1;
-
errnum = ERR_FILE_NOT_FOUND;
*rest = ch;
return 0;
Index: grub-0.95/netboot/fsys_tftp.c
===================================================================
--- grub-0.95.orig/netboot/fsys_tftp.c
+++ grub-0.95/netboot/fsys_tftp.c
@@ -409,7 +409,7 @@ tftp_read (char *addr, int size)
/* Check if the file DIRNAME really exists. Get the size and save it in
FILEMAX. */
int
-tftp_dir (char *dirname)
+tftp_dir (char *dirname, void (*handle)(char *))
{
int ch;
@@ -418,7 +418,7 @@ tftp_dir (char *dirname)
#endif
/* In TFTP, there is no way to know what files exist. */
- if (print_possibilities)
+ if (handle)
return 1;
/* Don't know the size yet. */