From 2e29408d1fdbe484003abe3ffcf7af51211b692e Mon Sep 17 00:00:00 2001 From: robertmh Date: Sun, 18 Nov 2007 07:14:26 +0000 Subject: [PATCH] 2007-11-18 Christian Franke * 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)". --- ChangeLog | 8 ++++++++ util/hostfs.c | 36 +++++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 78d610798..e4806bd6d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2007-11-18 Christian Franke + + * 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)". + 2007-11-18 Christian Franke * include/grub/i386/pc/init.h (struct grub_machine_mmap_entry): diff --git a/util/hostfs.c b/util/hostfs.c index 2fdc3587c..e8dc59695 100644 --- a/util/hostfs.c +++ b/util/hostfs.c @@ -25,6 +25,34 @@ #include #include + +#ifndef DT_DIR +/* dirent.d_type is a BSD extension, not part of POSIX */ +#include +#include + +static int +is_dir (const char *path, const char *name) +{ + int len1 = strlen(path); + int len2 = strlen(name); + + char pathname[len1 + 1 + len2 + 1 + 13]; + strcpy (pathname, path); + + /* Avoid UNC-path "//name" on Cygwin. */ + if (len1 > 0 && pathname[len1 - 1] != '/') + strcat (pathname, "/"); + + strcat (pathname, name); + + struct stat st; + 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 +76,11 @@ grub_hostfs_dir (grub_device_t device, const char *path, 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,7 +113,8 @@ grub_hostfs_read (grub_file_t file, char *buf, grub_size_t len) FILE *f; f = (FILE *) file->data; - int s= fread (buf, 1, len, f); + fseek (f, file->offset, SEEK_SET); + int s = fread (buf, 1, len, f); return s; } @@ -101,6 +134,7 @@ static grub_err_t grub_hostfs_label (grub_device_t device __attribute ((unused)), char **label __attribute ((unused))) { + *label = 0; return GRUB_ERR_NONE; }