From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1MDmGg-0007zl-91 for mharc-grub-devel@gnu.org; Mon, 08 Jun 2009 17:20:34 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MDmGe-0007ws-K7 for grub-devel@gnu.org; Mon, 08 Jun 2009 17:20:32 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MDmGa-0007tN-Tu for grub-devel@gnu.org; Mon, 08 Jun 2009 17:20:32 -0400 Received: from [199.232.76.173] (port=40877 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MDmGa-0007tH-Q4 for grub-devel@gnu.org; Mon, 08 Jun 2009 17:20:28 -0400 Received: from moutng.kundenserver.de ([212.227.126.186]:58213) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MDmGa-00052S-AS for grub-devel@gnu.org; Mon, 08 Jun 2009 17:20:28 -0400 Received: from [85.180.54.13] (e180054013.adsl.alicedsl.de [85.180.54.13]) by mrelayeu.kundenserver.de (node=mreu2) with ESMTP (Nemesis) id 0MKv5w-1MDmGZ22wx-0001vT; Mon, 08 Jun 2009 23:20:27 +0200 From: Felix Zielcke To: The development of GRUB 2 In-Reply-To: <1243885166.3417.11.camel@fz.local> References: <1241620317.3746.8.camel@fz.local> <1243885166.3417.11.camel@fz.local> Content-Type: multipart/mixed; boundary="=-qAzSLREz1AInhthi6WLU" Date: Mon, 08 Jun 2009 23:20:26 +0200 Message-Id: <1244496026.3833.37.camel@fz.local> Mime-Version: 1.0 X-Mailer: Evolution 2.26.2 X-Provags-ID: V01U2FsdGVkX18uP1FbIKLLVpGG98UGZrlKw6k2gQXeVkrjkDs c/4K++pMUtuTeGdrNZgFSYaX+HZoDlMqH7b1VW1+1JNyVPLGL+ ULZlv+p/eu27bExMRVmUQ== X-detected-operating-system: by monty-python.gnu.org: Genre and OS details not recognized. Subject: [PATCH] Re: grub-install --root-directory=/mnt /dev/sda1 fails X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GRUB 2 List-Id: The development of GRUB 2 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 08 Jun 2009 21:20:32 -0000 --=-qAzSLREz1AInhthi6WLU Content-Type: text/plain Content-Transfer-Encoding: 7bit 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 --=-qAzSLREz1AInhthi6WLU Content-Disposition: attachment; filename="make_sys_path_relative.patch.2" Content-Type: text/plain; name="make_sys_path_relative.patch.2"; charset="UTF-8" Content-Transfer-Encoding: 7bit 2009-06-08 Felix Zielcke * 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 (); --=-qAzSLREz1AInhthi6WLU--