From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1MEtal-00004t-Di for mharc-grub-devel@gnu.org; Thu, 11 Jun 2009 19:21:55 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MEtaj-0008WU-3T for grub-devel@gnu.org; Thu, 11 Jun 2009 19:21:53 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MEtae-0008WH-LE for grub-devel@gnu.org; Thu, 11 Jun 2009 19:21:52 -0400 Received: from [199.232.76.173] (port=59258 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MEtae-0008WE-Fi for grub-devel@gnu.org; Thu, 11 Jun 2009 19:21:48 -0400 Received: from moutng.kundenserver.de ([212.227.17.8]:65048) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MEtad-0003jS-Uj for grub-devel@gnu.org; Thu, 11 Jun 2009 19:21:48 -0400 Received: from [85.180.28.41] (e180028041.adsl.alicedsl.de [85.180.28.41]) by mrelayeu.kundenserver.de (node=mrbap0) with ESMTP (Nemesis) id 0MKsym-1MEtac0pHQ-000dqS; Fri, 12 Jun 2009 01:21:46 +0200 From: Felix Zielcke To: The development of GRUB 2 In-Reply-To: <1244674821.8525.23.camel@fz.local> References: <1241620317.3746.8.camel@fz.local> <1243885166.3417.11.camel@fz.local> <1244496026.3833.37.camel@fz.local> <1244674821.8525.23.camel@fz.local> Content-Type: multipart/mixed; boundary="=-nZp27cPp+CgxfzA+QaYZ" Date: Fri, 12 Jun 2009 01:21:45 +0200 Message-Id: <1244762505.3552.64.camel@fz.local> Mime-Version: 1.0 X-Mailer: Evolution 2.26.2 X-Provags-ID: V01U2FsdGVkX1+2PPsd7txwasAgdyFhE0Z6crb+eTwsT35hvzi +9t8ZGNzi1pL8pp0suXLV1DYCD/TwiD26NCQiGphS0PmYvOd8f kytDBcaxNkZxE7mDLbNbwHjKMmWAHf7 X-detected-operating-system: by monty-python.gnu.org: Genre and OS details not recognized. Subject: Re: [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: Thu, 11 Jun 2009 23:21:53 -0000 --=-nZp27cPp+CgxfzA+QaYZ Content-Type: text/plain Content-Transfer-Encoding: 7bit Am Donnerstag, den 11.06.2009, 01:00 +0200 schrieb Felix Zielcke: > Am Dienstag, den 09.06.2009, 23:51 +0200 schrieb Vladimir 'phcoder' > Serbinenko: > > > + > > +char *grub_make_system_path_relative_to_its_root (char *path) > > +{ > > + > > + struct stat st; > > + char buf[500], buf2[500]; > > Use malloc instead of static allocation > > Changed. > > > + p = strrchr (buf, '/'); > > + if (p != buf) > > + *p = 0; > > + else *++p = 0; > > You assume path starts with /. You have to check this. Otherwise you > > may get sigsegv > > Changed. > > + strcpy(buf2,buf); > > Just save (p - buf) instead of copying buf to buf2 > > I did this now if realpath () isn't avaible. > Now realpath is used in case it's avaible. POSIX specifies it and > readlink is actually using it if it's avaible. I didn't read the source > correctly. > The problem is just Cygwin. It has it but it returns the cygwin path. > So C:\\Windows would get /cygdrive/c/windows, which is easy to handle. > But realpath ("/boot/grub") would return /boot/grub which isn't true > from Windows/GRUB point of view. > Maybe Christian and Bean can say something about it. > MingW doestn't have it and I don't know what Windows would have, so the > MingW users would still use my own way. Here's now a new one which aborts if realpath is avaible but doestn't support (path, NULL) and the fallback function is changed to dynamically allocate the memory. And now all memory is properly free'd -- Felix Zielcke --=-nZp27cPp+CgxfzA+QaYZ Content-Disposition: attachment; filename="make_sys_path_relative.patch.5" Content-Type: text/plain; name="make_sys_path_relative.patch.5"; charset="UTF-8" Content-Transfer-Encoding: 7bit 2009-06-11 Felix Zielcke * configure.ac (AC_CHECK_FUNCS): Add realpath. * include/grub/util/hostdisk.c (grub_make_system_path_relative_to_its_root): New function prototype. * util/hostdisk.c: Include . (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/configure.ac b/configure.ac index b0f7bb7..9d594db 100644 --- a/configure.ac +++ b/configure.ac @@ -196,7 +196,7 @@ if test "$target_cpu"-"$platform" = i386-pc; then fi # Check for functions. -AC_CHECK_FUNCS(posix_memalign memalign asprintf) +AC_CHECK_FUNCS(posix_memalign memalign asprintf realpath) # # Check for target programs. diff --git a/include/grub/util/hostdisk.h b/include/grub/util/hostdisk.h index 21efb0d..85df1c6 100644 --- a/include/grub/util/hostdisk.h +++ b/include/grub/util/hostdisk.h @@ -23,5 +23,6 @@ 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,void **free_ptr); #endif /* ! GRUB_BIOSDISK_MACHINE_UTIL_HEADER */ diff --git a/util/hostdisk.c b/util/hostdisk.c index 1844a7e..3224e07 100644 --- a/util/hostdisk.c +++ b/util/hostdisk.c @@ -27,6 +27,7 @@ #include #include +#include #include #include #include @@ -1076,3 +1077,95 @@ 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, void **free_ptr) +{ + struct stat st; + char *buf, *buf2; + uintptr_t offset = 0; + dev_t num; + long path_max; + size_t len, len2; + char *p; + + +#ifdef HAVE_REALPATH + p = realpath (path, NULL); + + if (p == NULL) && (ernno != ) + grub_util_error ("failed to get realpath of %s", path); + else + grub_util_error ("realpath not supporting (path, NULL)"); + len = strlen (p) + 1; + buf = xmalloc (len); + buf2 = xmalloc (len); +# ifdef __CYGWIN__ + if (strncmp (p, 10, "/cygdrive/") == 0) + strcpy (buf, p + sizeof ("/cygdrive/c") - 1); + else + grub_util_error "path not under /cygdrive/. Aborting."; +# else + strcpy (buf, p); +#endif + free (p); +#else /* ! HAVE_REALPATH */ +# warning "The function `grub_make_system_path_relative_to_its_root' might not work on your OS correctly." + if (*path != '/') + { + len2 = 4096; + do + { + p = getcwd (buf, len) + if (p == NULL) + { + if (errno != ERANGE) + grub_util_error ("can not get current working directory"); + else + len2 *= 2; + } + } while (p == NULL) + + buf = xmalloc (strlen (path) + len2 + 1); + strcat (buf, "/"); + strcat (buf, path); + } + else + { + buf = xmalloc (strlen (path) + 1); + strcpy (buf, path) + } +#endif /* ! HAVE_REALPATH */ + buf2 = xmalloc (strlen (buf) + 1); + strcpy (buf2, buf); + *free_ptr = buf2; + if (stat (buf, &st) < 0) + grub_util_error ("can not stat %s", p); + + num = st.st_dev; + while (1) + { + p = strrchr (buf, '/'); + if (p == NULL) + grub_util_error ("FIXME no / in buf"); + if (p != buf) + *p = 0; + else + *++p = 0; + + if (stat (buf, &st) < 0) + grub_util_error ("can not stat %s", buf); + + if (st.st_dev != num) + break; + + offset = p - buf; + if (offset == 1) + { + free (buf); + return buf2; + } + } + free (buf); + return buf2 + offset; +} diff --git a/util/i386/pc/grub-setup.c b/util/i386/pc/grub-setup.c index bdf234c..c9243bd 100644 --- a/util/i386/pc/grub-setup.c +++ b/util/i386/pc/grub-setup.c @@ -89,7 +89,7 @@ setup (const char *dir, const char *root, const char *dest, int must_embed, int force) { char *boot_path, *core_path, *core_path_dev; - char *boot_img, *core_img; + char *boot_img, *core_img, *p, *free_ptr; size_t boot_size, core_size; grub_uint16_t core_sectors; grub_device_t root_dev, dest_dev; @@ -404,7 +404,10 @@ 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); + p = grub_util_get_path (dir, core_file); + core_path_dev = grub_make_system_path_relative_to_its_root (p,&free_ptr); + free (p); + free (free_ptr); /* It is a Good Thing to sync two times. */ sync (); --=-nZp27cPp+CgxfzA+QaYZ--