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)".
This commit is contained in:
robertmh 2007-11-18 07:14:26 +00:00
parent 398cd047ab
commit 2e29408d1f
2 changed files with 43 additions and 1 deletions

View File

@ -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):

View File

@ -25,6 +25,34 @@
#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;
}