Am Mittwoch, den 06.05.2009, 17:12 +0200 schrieb Vladimir 'phcoder'
Serbinenko:
> Don't we already have a function which transforms host directory into
> grub
> directory? AFAIR we have.

There's just the shell function in grub-mkconfig_lib.in
Here's now a patch wich implements it in util/hostdisk.c and gets used
for core_path_dev in setup ().
But it doestn't work with symlinks.
readlink () can only be used if the file pointed to is a symlink, not if
a symlink is somewhere in between.
coreutils where the readlink binary is from is GPL 3+ but the function
for it uses hash tables and it seems like it would be too much code to
copy just for this.
-- 
Felix Zielcke
2009-06-01  Felix Zielcke  <fziel...@z-51.de>

	    * include/grub/util/hostdisk.c
	    (grub_make_system_path_relative_to_its_root): New function
	    prototype.
	    * util/hostdisk.c (grub_make_system_path_relative_to_its_root): 
	    New function.
	    * util/i386/pc/grub-setup.c (setup): Use 
	    grub_make_system_path_relative_to_its_root to make core_path_dev
	    relative to the partition.

diff --git a/include/grub/util/hostdisk.h b/include/grub/util/hostdisk.h
index 21efb0d..0fb0219 100644
--- a/include/grub/util/hostdisk.h
+++ b/include/grub/util/hostdisk.h
@@ -23,5 +23,7 @@
 void grub_util_biosdisk_init (const char *dev_map);
 void grub_util_biosdisk_fini (void);
 char *grub_util_biosdisk_get_grub_dev (const char *os_dev);
+char *grub_make_system_path_relative_to_its_root (char *path);
+
 
 #endif /* ! GRUB_BIOSDISK_MACHINE_UTIL_HEADER */
diff --git a/util/hostdisk.c b/util/hostdisk.c
index eaccb73..2b80b48 100644
--- a/util/hostdisk.c
+++ b/util/hostdisk.c
@@ -1072,3 +1072,39 @@ grub_util_biosdisk_get_grub_dev (const char *os_dev)
   return make_device_name (drive, -1, -1);
 #endif
 }
+
+char *grub_make_system_path_relative_to_its_root (char *path)
+{
+
+  struct stat st;
+  char buf[500], buf2[500];
+  dev_t num;
+  char *p;
+
+  if (stat (path, &st) < 0)
+    return path;
+
+  num = st.st_dev;
+  memset (buf, 0 , sizeof (buf));
+  strncpy (buf, path, 500);
+  strcpy (buf2, buf);
+  while (1)
+    {
+      p = strrchr (buf, '/');
+      if (p != buf)
+	*p = 0;
+      else *++p = 0;
+
+      if (stat (buf, &st) < 0)
+	return path;
+
+      if (st.st_dev != num)
+	break;
+      strcpy(buf2,buf);
+      if (p - 1 == buf)
+	return path;
+    }
+  for (p = buf2; *p != 0; p++)
+    path++;
+  return path;
+}
diff --git a/util/i386/pc/grub-setup.c b/util/i386/pc/grub-setup.c
index 997811b..57f49d4 100644
--- a/util/i386/pc/grub-setup.c
+++ b/util/i386/pc/grub-setup.c
@@ -405,6 +405,7 @@ unable_to_embed:
   /* Make sure that GRUB reads the identical image as the OS.  */
   tmp_img = xmalloc (core_size);
   core_path_dev = grub_util_get_path (dir, core_file);
+  core_path_dev = grub_make_system_path_relative_to_its_root (core_path_dev);
   
   /* It is a Good Thing to sync two times.  */
   sync ();
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to