Christian Franke <[EMAIL PROTECTED]> writes: > 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)
is_dir ( > +{ > + int len1 = strlen(path), len2 = strlen(name); Please split this up. Or even better use separate declarations and code. > + char pathname[len1+1+len2+1+13]; Please add spaces around binary operators. > + struct stat st; > + strcpy (pathname, path); Please add more blank lines between your code to make it easier to read. :-) > + /* Avoid UNC-path "//name" on Cygwin */ ". " like explained in a previous email. > + if (len1 > 0 && pathname[len1-1] != '/') > + strcat (pathname, "/"); > + strcat (pathname, name); > + if (stat (pathname, &st)) > + return 0; > + return S_ISDIR(st.st_mode); > +} > +#endif Why can't you just use S_ISDIR? > 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); "int s = " > 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 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel