Second version of the patch. It fixes another bug: missing fseek() in grub_hostfs_read().
Christian 2007-11-02 Christian Franke <[EMAIL PROTECTED]> * util/hostfs.c (is_dir): New function. (grub_hostfs_dir): Handle missing dirent.d_type case. (grub_hostfs_read): Add missing fseek(). (grub_hostfs_label): Clear label pointer. This fixes a crash of grub-emu on "ls (host)".
--- grub2.orig/util/hostfs.c 2007-08-02 19:24:06.000000000 +0200 +++ grub2/util/hostfs.c 2007-11-02 21:31:37.703125000 +0100 @@ -25,6 +25,29 @@ #include <dirent.h> #include <stdio.h> + +#ifndef DT_DIR +/* dirent.d_type is a BSD extension, not part of POSIX */ +#include <sys/stat.h> +#include <string.h> + +static int +is_dir(const char *path, const char *name) +{ + int len1 = strlen(path), len2 = strlen(name); + char pathname[len1+1+len2+1+13]; + struct stat st; + strcpy (pathname, path); + /* Avoid UNC-path "//name" on Cygwin */ + if (len1 > 0 && pathname[len1-1] != '/') + strcat (pathname, "/"); + strcat (pathname, name); + if (stat (pathname, &st)) + return 0; + return S_ISDIR(st.st_mode); +} +#endif + static grub_err_t grub_hostfs_dir (grub_device_t device, const char *path, int (*hook) (const char *filename, int dir)) @@ -48,7 +71,11 @@ grub_hostfs_dir (grub_device_t device, c if (! de) break; +#ifdef DT_DIR hook (de->d_name, de->d_type == DT_DIR); +#else + hook (de->d_name, is_dir(path, de->d_name)); +#endif } closedir (dir); @@ -81,6 +108,7 @@ grub_hostfs_read (grub_file_t file, char FILE *f; f = (FILE *) file->data; + fseek (f, file->offset, SEEK_SET); int s= fread (buf, 1, len, f); return s; @@ -101,6 +129,7 @@ static grub_err_t grub_hostfs_label (grub_device_t device __attribute ((unused)), char **label __attribute ((unused))) { + *label = 0; return GRUB_ERR_NONE; }
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel