1 Index: grub-0.95/stage2/fsys_jfs.c
2 ===================================================================
3 --- grub-0.95.orig/stage2/fsys_jfs.c
4 +++ grub-0.95/stage2/fsys_jfs.c
5 @@ -270,7 +270,7 @@ jfs_read (char *buf, int len)
9 -jfs_dir (char *dirname)
10 +jfs_dir (char *dirname, void (*handle)(char *))
14 @@ -357,12 +357,9 @@ jfs_dir (char *dirname)
16 cmp = (!*dirname) ? -1 : substring (dirname, namebuf);
18 - if (print_possibilities && ch != '/'
20 - if (print_possibilities > 0)
21 - print_possibilities = -print_possibilities;
22 - print_a_completion (namebuf);
24 + if (handle && ch != '/' && cmp <= 0)
30 @@ -372,9 +369,6 @@ jfs_dir (char *dirname)
34 - if (print_possibilities < 0)
37 errnum = ERR_FILE_NOT_FOUND;
40 Index: grub-0.95/stage2/fsys_minix.c
41 ===================================================================
42 --- grub-0.95.orig/stage2/fsys_minix.c
43 +++ grub-0.95/stage2/fsys_minix.c
44 @@ -294,7 +294,7 @@ minix_read (char *buf, int len)
45 inode of the file we were trying to look up
46 side effects: none yet */
48 -minix_dir (char *dirname)
49 +minix_dir (char *dirname, void (*handle)(char *))
51 int current_ino = MINIX_ROOT_INO; /* start at the root */
52 int updir_ino = current_ino; /* the parent of the current directory */
53 @@ -457,18 +457,9 @@ minix_dir (char *dirname)
55 if (loc >= INODE->i_size)
57 - if (print_possibilities < 0)
65 - errnum = ERR_FILE_NOT_FOUND;
68 - return (print_possibilities < 0);
69 + errnum = ERR_FILE_NOT_FOUND;
74 /* else, find the (logical) block component of our location */
75 @@ -510,20 +501,15 @@ minix_dir (char *dirname)
76 str_chk = substring (dirname, dp->name);
79 - if (print_possibilities && ch != '/'
80 - && (!*dirname || str_chk <= 0))
82 - if (print_possibilities > 0)
83 - print_possibilities = -print_possibilities;
84 - print_a_completion (dp->name);
86 + if (handle && ch != '/' && (!*dirname || str_chk <= 0))
90 dp->name[namelen] = saved_c;
94 - while (!dp->inode || (str_chk || (print_possibilities && ch != '/')));
95 + while (!dp->inode || (str_chk || (handle && ch != '/')));
97 current_ino = dp->inode;
98 *(dirname = rest) = ch;
99 Index: grub-0.95/stage2/fsys_reiserfs.c
100 ===================================================================
101 --- grub-0.95.orig/stage2/fsys_reiserfs.c
102 +++ grub-0.95/stage2/fsys_reiserfs.c
103 @@ -991,7 +991,7 @@ reiserfs_read (char *buf, int len)
104 * the size of the file.
107 -reiserfs_dir (char *dirname)
108 +reiserfs_dir (char *dirname, void (*handle)(char *))
110 struct reiserfs_de_head *de_head;
112 @@ -1123,7 +1123,7 @@ reiserfs_dir (char *dirname)
116 - if (print_possibilities && ch != '/')
117 + if (handle && ch != '/')
118 do_possibilities = 1;
119 # endif /* ! STAGE1_5 */
121 @@ -1170,10 +1170,8 @@ reiserfs_dir (char *dirname)
125 - if (print_possibilities > 0)
126 - print_possibilities = -print_possibilities;
128 - print_a_completion (filename);
133 @@ -1189,12 +1187,6 @@ reiserfs_dir (char *dirname)
139 - if (print_possibilities < 0)
141 -# endif /* ! STAGE1_5 */
143 errnum = ERR_FILE_NOT_FOUND;
146 Index: grub-0.95/stage2/fsys_iso9660.c
147 ===================================================================
148 --- grub-0.95.orig/stage2/fsys_iso9660.c
149 +++ grub-0.95/stage2/fsys_iso9660.c
150 @@ -133,7 +133,7 @@ iso9660_mount (void)
154 -iso9660_dir (char *dirname)
155 +iso9660_dir (char *dirname, void (*handle)(char *))
157 struct iso_directory_record *idr;
159 @@ -346,7 +346,7 @@ iso9660_dir (char *dirname)
160 if (name_len >= pathlen
161 && !memcmp(name, dirname, pathlen))
163 - if (dirname[pathlen] == '/' || !print_possibilities)
164 + if (dirname[pathlen] == '/' || !handle)
167 * DIRNAME is directory component of pathname,
168 @@ -377,11 +377,9 @@ iso9660_dir (char *dirname)
169 else /* Completion */
172 - if (print_possibilities > 0)
173 - print_possibilities = -print_possibilities;
174 memcpy(NAME_BUF, name, name_len);
175 NAME_BUF[name_len] = '\0';
176 - print_a_completion (NAME_BUF);
181 @@ -390,7 +388,7 @@ iso9660_dir (char *dirname)
182 size -= ISO_SECTOR_SIZE;
185 - if (dirname[pathlen] == '/' || print_possibilities >= 0)
186 + if (dirname[pathlen] == '/' || handle)
188 errnum = ERR_FILE_NOT_FOUND;
190 Index: grub-0.95/stage2/fsys_fat.c
191 ===================================================================
192 --- grub-0.95.orig/stage2/fsys_fat.c
193 +++ grub-0.95/stage2/fsys_fat.c
194 @@ -286,7 +286,7 @@ fat_read (char *buf, int len)
198 -fat_dir (char *dirname)
199 +fat_dir (char *dirname, void (*handle)(char *))
201 char *rest, ch, dir_buf[FAT_DIRENTRY_LENGTH];
202 char *filename = (char *) NAME_BUF;
203 @@ -342,7 +342,7 @@ fat_dir (char *dirname)
207 - if (print_possibilities && ch != '/')
208 + if (handle && ch != '/')
209 do_possibilities = 1;
212 @@ -353,16 +353,6 @@ fat_dir (char *dirname)
217 - if (print_possibilities < 0)
224 -# endif /* STAGE1_5 */
226 errnum = ERR_FILE_NOT_FOUND;
229 @@ -457,11 +447,7 @@ fat_dir (char *dirname)
232 if (substring (dirname, filename) <= 0)
234 - if (print_possibilities > 0)
235 - print_possibilities = -print_possibilities;
236 - print_a_completion (filename);
241 # endif /* STAGE1_5 */
242 Index: grub-0.95/stage2/filesys.h
243 ===================================================================
244 --- grub-0.95.orig/stage2/filesys.h
245 +++ grub-0.95/stage2/filesys.h
247 #define FSYS_FFS_NUM 1
248 int ffs_mount (void);
249 int ffs_read (char *buf, int len);
250 -int ffs_dir (char *dirname);
251 +int ffs_dir (char *dirname, void (*handle)(char *));
252 int ffs_embed (int *start_sector, int needed_sectors);
254 #define FSYS_FFS_NUM 0
255 @@ -34,7 +34,7 @@ int ffs_embed (int *start_sector, int ne
256 #define FSYS_UFS2_NUM 1
257 int ufs2_mount (void);
258 int ufs2_read (char *buf, int len);
259 -int ufs2_dir (char *dirname);
260 +int ufs2_dir (char *dirname, void (*handle)(char *));
261 int ufs2_embed (int *start_sector, int needed_sectors);
263 #define FSYS_UFS2_NUM 0
264 @@ -44,7 +44,7 @@ int ufs2_embed (int *start_sector, int n
265 #define FSYS_FAT_NUM 1
266 int fat_mount (void);
267 int fat_read (char *buf, int len);
268 -int fat_dir (char *dirname);
269 +int fat_dir (char *dirname, void (*handle)(char *));
271 #define FSYS_FAT_NUM 0
273 @@ -53,7 +53,7 @@ int fat_dir (char *dirname);
274 #define FSYS_EXT2FS_NUM 1
275 int ext2fs_mount (void);
276 int ext2fs_read (char *buf, int len);
277 -int ext2fs_dir (char *dirname);
278 +int ext2fs_dir (char *dirname, void (*handle)(char *));
280 #define FSYS_EXT2FS_NUM 0
282 @@ -62,7 +62,7 @@ int ext2fs_dir (char *dirname);
283 #define FSYS_MINIX_NUM 1
284 int minix_mount (void);
285 int minix_read (char *buf, int len);
286 -int minix_dir (char *dirname);
287 +int minix_dir (char *dirname, void (*handle)(char *));
289 #define FSYS_MINIX_NUM 0
291 @@ -71,7 +71,7 @@ int minix_dir (char *dirname);
292 #define FSYS_REISERFS_NUM 1
293 int reiserfs_mount (void);
294 int reiserfs_read (char *buf, int len);
295 -int reiserfs_dir (char *dirname);
296 +int reiserfs_dir (char *dirname, void (*handle)(char *));
297 int reiserfs_embed (int *start_sector, int needed_sectors);
299 #define FSYS_REISERFS_NUM 0
300 @@ -81,7 +81,7 @@ int reiserfs_embed (int *start_sector, i
301 #define FSYS_VSTAFS_NUM 1
302 int vstafs_mount (void);
303 int vstafs_read (char *buf, int len);
304 -int vstafs_dir (char *dirname);
305 +int vstafs_dir (char *dirname, void (*handle)(char *));
307 #define FSYS_VSTAFS_NUM 0
309 @@ -90,7 +90,7 @@ int vstafs_dir (char *dirname);
310 #define FSYS_JFS_NUM 1
311 int jfs_mount (void);
312 int jfs_read (char *buf, int len);
313 -int jfs_dir (char *dirname);
314 +int jfs_dir (char *dirname, void (*handle)(char *));
315 int jfs_embed (int *start_sector, int needed_sectors);
317 #define FSYS_JFS_NUM 0
318 @@ -100,7 +100,7 @@ int jfs_embed (int *start_sector, int ne
319 #define FSYS_XFS_NUM 1
320 int xfs_mount (void);
321 int xfs_read (char *buf, int len);
322 -int xfs_dir (char *dirname);
323 +int xfs_dir (char *dirname, void (*handle)(char *));
325 #define FSYS_XFS_NUM 0
327 @@ -109,7 +109,7 @@ int xfs_dir (char *dirname);
328 #define FSYS_TFTP_NUM 1
329 int tftp_mount (void);
330 int tftp_read (char *buf, int len);
331 -int tftp_dir (char *dirname);
332 +int tftp_dir (char *dirname, void (*handle)(char *));
333 void tftp_close (void);
335 #define FSYS_TFTP_NUM 0
336 @@ -119,7 +119,7 @@ void tftp_close (void);
337 #define FSYS_ISO9660_NUM 1
338 int iso9660_mount (void);
339 int iso9660_read (char *buf, int len);
340 -int iso9660_dir (char *dirname);
341 +int iso9660_dir (char *dirname, void (*handle)(char *));
343 #define FSYS_ISO9660_NUM 0
345 @@ -150,16 +150,10 @@ struct fsys_entry
347 int (*mount_func) (void);
348 int (*read_func) (char *buf, int len);
349 - int (*dir_func) (char *dirname);
350 + int (*dir_func) (char *dirname, void (*print_one)(char *));
351 void (*close_func) (void);
352 int (*embed_func) (int *start_sector, int needed_sectors);
356 -# define print_possibilities 0
358 -extern int print_possibilities;
362 extern struct fsys_entry fsys_table[NUM_FSYS + 1];
363 Index: grub-0.95/stage2/fsys_ext2fs.c
364 ===================================================================
365 --- grub-0.95.orig/stage2/fsys_ext2fs.c
366 +++ grub-0.95/stage2/fsys_ext2fs.c
367 @@ -491,7 +491,7 @@ int ext2_is_fast_symlink (void)
368 * side effects: messes up GROUP_DESC buffer area
371 -ext2fs_dir (char *dirname)
372 +ext2fs_dir (char *dirname, void (*handle)(char *))
374 int current_ino = EXT2_ROOT_INO; /* start at the root */
375 int updir_ino = current_ino; /* the parent of the current directory */
376 @@ -517,7 +517,6 @@ ext2fs_dir (char *dirname)
382 current_ino = inode to lookup
383 dirname = pointer to filename component we are cur looking up within
384 @@ -709,18 +708,9 @@ ext2fs_dir (char *dirname)
386 if (loc >= INODE->i_size)
388 - if (print_possibilities < 0)
396 - errnum = ERR_FILE_NOT_FOUND;
399 - return (print_possibilities < 0);
400 + errnum = ERR_FILE_NOT_FOUND;
405 /* else, find the (logical) block component of our location */
406 @@ -761,20 +751,15 @@ ext2fs_dir (char *dirname)
407 str_chk = substring (dirname, dp->name);
410 - if (print_possibilities && ch != '/'
411 - && (!*dirname || str_chk <= 0))
413 - if (print_possibilities > 0)
414 - print_possibilities = -print_possibilities;
415 - print_a_completion (dp->name);
417 + if (handle && ch != '/' && (!*dirname || str_chk <= 0))
421 dp->name[dp->name_len] = saved_c;
425 - while (!dp->inode || (str_chk || (print_possibilities && ch != '/')));
426 + while (!dp->inode || (str_chk || (handle && ch != '/')));
428 current_ino = dp->inode;
429 *(dirname = rest) = ch;
430 Index: grub-0.95/stage2/fsys_ffs.c
431 ===================================================================
432 --- grub-0.95.orig/stage2/fsys_ffs.c
433 +++ grub-0.95/stage2/fsys_ffs.c
434 @@ -180,7 +180,7 @@ ffs_read (char *buf, int len)
438 -ffs_dir (char *dirname)
439 +ffs_dir (char *dirname, void (*handle)(char *))
442 int block, off, loc, map, ino = ROOTINO;
443 @@ -236,13 +236,6 @@ loop:
445 if (loc >= INODE->i_size)
451 - if (print_possibilities < 0)
454 errnum = ERR_FILE_NOT_FOUND;
457 @@ -267,18 +260,13 @@ loop:
461 - if (dp->d_ino && print_possibilities && ch != '/'
462 + if (dp->d_ino && handle && ch != '/'
463 && (!*dirname || substring (dirname, dp->d_name) <= 0))
465 - if (print_possibilities > 0)
466 - print_possibilities = -print_possibilities;
468 - print_a_completion (dp->d_name);
470 + handle (dp->d_name);
471 #endif /* STAGE1_5 */
473 while (!dp->d_ino || (substring (dirname, dp->d_name) != 0
474 - || (print_possibilities && ch != '/')));
475 + || (handle && ch != '/')));
477 /* only get here if we have a matching directory entry */
479 Index: grub-0.95/stage2/fsys_vstafs.c
480 ===================================================================
481 --- grub-0.95.orig/stage2/fsys_vstafs.c
482 +++ grub-0.95/stage2/fsys_vstafs.c
483 @@ -115,7 +115,7 @@ vstafs_nextdir (void)
487 -vstafs_dir (char *dirname)
488 +vstafs_dir (char *dirname, void (*handle)(char *))
492 @@ -146,14 +146,9 @@ vstafs_dir (char *dirname)
496 - if (print_possibilities && ch != '/'
497 + if (handle && ch != '/'
498 && (! *dirname || strcmp (dirname, d->name) <= 0))
500 - if (print_possibilities > 0)
501 - print_possibilities = -print_possibilities;
503 - printf (" %s", d->name);
507 if (! grub_strcmp (dirname, d->name))
509 @@ -168,12 +163,6 @@ vstafs_dir (char *dirname)
510 *(dirname = fn) = ch;
513 - if (print_possibilities < 0)
519 errnum = ERR_FILE_NOT_FOUND;
522 Index: grub-0.95/stage2/fsys_ufs2.c
523 ===================================================================
524 --- grub-0.95.orig/stage2/fsys_ufs2.c
525 +++ grub-0.95/stage2/fsys_ufs2.c
526 @@ -204,7 +204,7 @@ ufs2_read (char *buf, int len)
530 -ufs2_dir (char *dirname)
531 +ufs2_dir (char *dirname, void (*handle)(char *))
534 int block, off, loc, ino = ROOTINO;
535 @@ -261,9 +261,6 @@ loop:
537 if (loc >= INODE_UFS2->di_size)
539 - if (print_possibilities < 0)
542 errnum = ERR_FILE_NOT_FOUND;
545 @@ -288,18 +285,13 @@ loop:
549 - if (dp->d_ino && print_possibilities && ch != '/'
550 + if (dp->d_ino && handle && ch != '/'
551 && (!*dirname || substring (dirname, dp->d_name) <= 0))
553 - if (print_possibilities > 0)
554 - print_possibilities = -print_possibilities;
556 - print_a_completion (dp->d_name);
558 + handle (dp->d_name);
559 #endif /* STAGE1_5 */
561 while (!dp->d_ino || (substring (dirname, dp->d_name) != 0
562 - || (print_possibilities && ch != '/')));
563 + || (handle && ch != '/')));
565 /* only get here if we have a matching directory entry */
567 Index: grub-0.95/stage2/disk_io.c
568 ===================================================================
569 --- grub-0.95.orig/stage2/disk_io.c
570 +++ grub-0.95/stage2/disk_io.c
571 @@ -36,7 +36,6 @@ void (*disk_read_hook) (int, int, int) =
572 void (*disk_read_func) (int, int, int) = NULL;
575 -int print_possibilities;
577 static int do_completion;
579 @@ -1479,7 +1478,7 @@ print_completions (int is_filename, int
581 grub_printf (" Possible files are:");
584 + dir (buf, print_a_completion);
586 if (is_completion && *unique_string)
588 @@ -1498,7 +1497,7 @@ print_completions (int is_filename, int
593 + dir (buf, print_a_completion);
595 /* Restore the original unique value. */
597 @@ -1626,12 +1625,7 @@ grub_open (char *filename)
598 if (!errnum && fsys_type == NUM_FSYS)
599 errnum = ERR_FSYS_MOUNT;
602 - /* set "dir" function to open a file */
603 - print_possibilities = 0;
606 - if (!errnum && (*(fsys_table[fsys_type].dir_func)) (filename))
607 + if (!errnum && (*(fsys_table[fsys_type].dir_func)) (filename, NULL))
609 #ifndef NO_DECOMPRESSION
610 return gunzip_test_header ();
611 @@ -1752,7 +1746,7 @@ grub_seek (int offset)
616 +dir (char *dirname, void (*handle)(char *))
618 #ifndef NO_DECOMPRESSION
620 @@ -1761,19 +1755,18 @@ dir (char *dirname)
621 if (!(dirname = setup_part (dirname)))
626 errnum = ERR_BAD_FILENAME;
628 - if (fsys_type == NUM_FSYS)
629 + else if (fsys_type == NUM_FSYS)
630 errnum = ERR_FSYS_MOUNT;
635 - /* set "dir" function to list completions */
636 - print_possibilities = 1;
638 - return (*(fsys_table[fsys_type].dir_func)) (dirname);
641 + fsys_table[fsys_type].dir_func (dirname, handle);
642 + if (errnum == ERR_FILE_NOT_FOUND)
645 + return errnum == 0;
647 #endif /* STAGE1_5 */
649 Index: grub-0.95/stage2/fsys_xfs.c
650 ===================================================================
651 --- grub-0.95.orig/stage2/fsys_xfs.c
652 +++ grub-0.95/stage2/fsys_xfs.c
653 @@ -534,7 +534,7 @@ xfs_read (char *buf, int len)
657 -xfs_dir (char *dirname)
658 +xfs_dir (char *dirname, void (*handle)(char *))
660 xfs_ino_t ino, parent_ino, new_ino;
662 @@ -595,11 +595,9 @@ xfs_dir (char *dirname)
664 cmp = (!*dirname) ? -1 : substring (dirname, name);
666 - if (print_possibilities && ch != '/' && cmp <= 0) {
667 - if (print_possibilities > 0)
668 - print_possibilities = -print_possibilities;
669 - print_a_completion (name);
671 + if (handle && ch != '/' && cmp <= 0)
677 @@ -610,9 +608,6 @@ xfs_dir (char *dirname)
679 name = next_dentry (&new_ino);
681 - if (print_possibilities < 0)
684 errnum = ERR_FILE_NOT_FOUND;
687 Index: grub-0.95/netboot/fsys_tftp.c
688 ===================================================================
689 --- grub-0.95.orig/netboot/fsys_tftp.c
690 +++ grub-0.95/netboot/fsys_tftp.c
691 @@ -409,7 +409,7 @@ tftp_read (char *addr, int size)
692 /* Check if the file DIRNAME really exists. Get the size and save it in
695 -tftp_dir (char *dirname)
696 +tftp_dir (char *dirname, void (*handle)(char *))
700 @@ -418,7 +418,7 @@ tftp_dir (char *dirname)
703 /* In TFTP, there is no way to know what files exist. */
704 - if (print_possibilities)
708 /* Don't know the size yet. */