Am Montag, den 01.06.2009, 21:39 +0200 schrieb Felix Zielcke:
> 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.
Here's a new patch which prints out an error if stat () fails.
--
Felix Zielcke
2009-06-08 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/util/hostdisk.c b/util/hostdisk.c
index a7262dd..0a786ba 100644
--- a/util/hostdisk.c
+++ b/util/hostdisk.c
@@ -1076,3 +1076,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 NULL;
+
+ 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 NULL;
+
+ 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..9446fd5 100644
--- a/util/i386/pc/grub-setup.c
+++ b/util/i386/pc/grub-setup.c
@@ -405,6 +405,9 @@ 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);
+ if (core_path_dev == NULL)
+ grub_util_error ("failed to make path of core.img relative to its root");
/* 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