All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Allow build without dirent.d_type, fix "ls (host)" crash
@ 2007-10-23 19:50 Christian Franke
  2007-11-02 20:59 ` Christian Franke
  0 siblings, 1 reply; 7+ messages in thread
From: Christian Franke @ 2007-10-23 19:50 UTC (permalink / raw)
  To: grub-devel

[-- Attachment #1: Type: text/plain, Size: 573 bytes --]

This patch enables compilation on systems without the BSD extension 
dirent.d_type. It relies on #define DT_DIR, won't work for enums (glibc 
dirent.h contains both :-).

An alternative would be to include is_dir() unconditionally and call it 
also when d_type == DT_UNKNOWN.

The patch also fixes a grub-emu crash.

Christian


2007-10-23  Christian Franke  <franke@computer.org>

	* util/hostfs.c (is_dir): New function.
	(grub_hostfs_dir):  Handle missing dirent.d_type case.
	(grub_hostfs_label): Clear label pointer. This fixes a crash
	of grub-emu on "ls (host)".




[-- Attachment #2: grub2-hostfs-d_type.patch --]
[-- Type: text/x-patch, Size: 1300 bytes --]

--- grub2.orig/util/hostfs.c	2007-08-02 19:24:06.000000000 +0200
+++ grub2/util/hostfs.c	2007-10-13 17:17:20.000000000 +0200
@@ -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);
@@ -101,6 +128,7 @@ static grub_err_t
 grub_hostfs_label (grub_device_t device __attribute ((unused)),
 		   char **label __attribute ((unused)))
 {
+  *label = 0;
   return GRUB_ERR_NONE;
 }
 

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2007-11-18  7:14 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-10-23 19:50 [PATCH] Allow build without dirent.d_type, fix "ls (host)" crash Christian Franke
2007-11-02 20:59 ` Christian Franke
2007-11-09 14:55   ` Marco Gerards
2007-11-09 21:06     ` Christian Franke
2007-11-10 16:03       ` Marco Gerards
2007-11-10 18:16         ` Christian Franke
2007-11-18  7:14         ` Robert Millan

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.