]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
2007-11-18 Christian Franke <franke@computer.org>
authorrobertmh <robertmh@localhost>
Sun, 18 Nov 2007 07:14:26 +0000 (07:14 +0000)
committerrobertmh <robertmh@localhost>
Sun, 18 Nov 2007 07:14:26 +0000 (07:14 +0000)
* 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
util/hostfs.c

index 78d610798838e88a6eaecc3c45c568fb9dbe7614..e4806bd6d02a295b8d43605fd305b6401e3a8d53 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2007-11-18  Christian Franke  <franke@computer.org>
+
+       * 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  <franke@computer.org>
 
        * include/grub/i386/pc/init.h (struct grub_machine_mmap_entry):
index 2fdc3587c28dedfb44baece446094ff240bae1a7..e8dc596958638949f9d60df4be7c2e7dc39d42aa 100644 (file)
 #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);
+  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;
 }