]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
merge with mainline
authorBVK Chaitanya <bvk.groups@gmail.com>
Tue, 4 May 2010 03:39:03 +0000 (09:09 +0530)
committerBVK Chaitanya <bvk.groups@gmail.com>
Tue, 4 May 2010 03:39:03 +0000 (09:09 +0530)
1  2 
conf/common.rmk
include/grub/emu/getroot.h
include/grub/emu/misc.h
kern/emu/getroot.c
kern/emu/main.c
kern/emu/misc.c
util/grub-mkrelpath.c
util/grub-probe.c
util/misc.c

diff --cc conf/common.rmk
Simple merge
Simple merge
index 4e4df2ad24bf9f5f042eb6f085c052a21381b074,0000000000000000000000000000000000000000..146e64aa9c2b9f8a833effae944810d137d98128
mode 100644,000000..100644
--- /dev/null
@@@ -1,41 -1,0 +1,43 @@@
 +#ifndef GRUB_EMU_MISC_H
 +#define GRUB_EMU_MISC_H 1
 +
 +#include <grub/symbol.h>
 +#include <grub/types.h>
 +
 +#ifdef __NetBSD__
 +/* NetBSD uses /boot for its boot block.  */
 +# define DEFAULT_DIRECTORY    "/grub"
 +#else
 +# define DEFAULT_DIRECTORY    "/boot/grub"
 +#endif
 +
 +#define DEFAULT_DEVICE_MAP    DEFAULT_DIRECTORY "/device.map"
 +
 +extern int verbosity;
 +extern const char *program_name;
 +
 +void grub_init_all (void);
 +void grub_fini_all (void);
 +
++char *grub_make_system_path_relative_to_its_root (const char *path);
++
 +void * EXPORT_FUNC(xmalloc) (grub_size_t size);
 +void * EXPORT_FUNC(xrealloc) (void *ptr, grub_size_t size);
 +char * EXPORT_FUNC(xstrdup) (const char *str);
 +char * EXPORT_FUNC(xasprintf) (const char *fmt, ...);
 +
 +void EXPORT_FUNC(grub_util_warn) (const char *fmt, ...);
 +void EXPORT_FUNC(grub_util_info) (const char *fmt, ...);
 +void EXPORT_FUNC(grub_util_error) (const char *fmt, ...) __attribute__ ((noreturn));
 +
 +#ifndef HAVE_VASPRINTF
 +int EXPORT_FUNC(vasprintf) (char **buf, const char *fmt, va_list ap);
 +#endif
 +
 +#ifndef  HAVE_ASPRINTF
 +int EXPORT_FUNC(asprintf) (char **buf, const char *fmt, ...);
 +#endif
 +
 +char * EXPORT_FUNC(xasprintf) (const char *fmt, ...);
 +
 +#endif /* GRUB_EMU_MISC_H */
index 91799aa8f68543ae2b5cf945bcf67bbf3e71486d,891bd0f1055837826c35252bd3cf68f1b056c06a..10a65aa87e8961759f922495b354742649b4ce08
  #include <unistd.h>
  #include <string.h>
  #include <dirent.h>
++#include <errno.h>
 +#include <stdio.h>
 +#include <stdlib.h>
++#include <stdint.h>
  
  #ifdef __CYGWIN__
  # include <sys/fcntl.h>
@@@ -641,4 -540,4 +546,3 @@@ grub_util_check_char_device (const cha
    else
      return 0;
  }
--
diff --cc kern/emu/main.c
index c9b1d65955925e0e30ab90a26048417cc2566a4e,8c53b0aca14b99ab3354c621097f46e79a8b2bfd..fb5dbf19fa2f5c0cf82fca175745c265c72aa2f5
@@@ -246,7 -242,7 +246,7 @@@ main (int argc, char *argv[]
    if (strcmp (root_dev, "host") == 0)
      dir = xstrdup (dir);
    else
-     dir = grub_get_prefix (dir);
 -    dir = make_system_path_relative_to_its_root (dir);
++    dir = grub_make_system_path_relative_to_its_root (dir);
    prefix = xmalloc (strlen (root_dev) + 2 + strlen (dir) + 1);
    sprintf (prefix, "(%s)%s", root_dev, dir);
    free (dir);
diff --cc kern/emu/misc.c
index 999cdf2575ed8ce523d5abfebfe2dfbd2ca75fe7,0000000000000000000000000000000000000000..56195a851335f7144927b56dbfbe30b18dd4f1fd
mode 100644,000000..100644
--- /dev/null
@@@ -1,173 -1,0 +1,276 @@@
 +#include <config.h>
 +
 +#include <errno.h>
 +#include <stdio.h>
 +#include <stdlib.h>
++#include <stdint.h>
 +#include <string.h>
 +#include <sys/time.h>
++#include <sys/types.h>
++#include <sys/stat.h>
++#include <unistd.h>
 +
 +#include <grub/mm.h>
 +#include <grub/err.h>
 +#include <grub/env.h>
 +#include <grub/types.h>
 +#include <grub/misc.h>
 +#include <grub/i18n.h>
 +#include <grub/time.h>
 +#include <grub/emu/misc.h>
 +
 +int verbosity;
 +
 +void
 +grub_util_warn (const char *fmt, ...)
 +{
 +  va_list ap;
 +
 +  fprintf (stderr, _("%s: warn:"), program_name);
 +  fprintf (stderr, " ");
 +  va_start (ap, fmt);
 +  vfprintf (stderr, fmt, ap);
 +  va_end (ap);
 +  fprintf (stderr, ".\n");
 +  fflush (stderr);
 +}
 +
 +void
 +grub_util_info (const char *fmt, ...)
 +{
 +  if (verbosity > 0)
 +    {
 +      va_list ap;
 +
 +      fprintf (stderr, _("%s: info:"), program_name);
 +      fprintf (stderr, " ");
 +      va_start (ap, fmt);
 +      vfprintf (stderr, fmt, ap);
 +      va_end (ap);
 +      fprintf (stderr, ".\n");
 +      fflush (stderr);
 +    }
 +}
 +
 +void
 +grub_util_error (const char *fmt, ...)
 +{
 +  va_list ap;
 +
 +  fprintf (stderr, _("%s: error:"), program_name);
 +  fprintf (stderr, " ");
 +  va_start (ap, fmt);
 +  vfprintf (stderr, fmt, ap);
 +  va_end (ap);
 +  fprintf (stderr, ".\n");
 +  exit (1);
 +}
 +
 +void *
 +xmalloc (grub_size_t size)
 +{
 +  void *p;
 +
 +  p = malloc (size);
 +  if (! p)
 +    grub_util_error ("out of memory");
 +
 +  return p;
 +}
 +
 +void *
 +xrealloc (void *ptr, grub_size_t size)
 +{
 +  ptr = realloc (ptr, size);
 +  if (! ptr)
 +    grub_util_error ("out of memory");
 +
 +  return ptr;
 +}
 +
 +char *
 +xstrdup (const char *str)
 +{
 +  size_t len;
 +  char *newstr;
 +
 +  len = strlen (str);
 +  newstr = (char *) xmalloc (len + 1);
 +  memcpy (newstr, str, len + 1);
 +
 +  return newstr;
 +}
 +
 +#ifndef HAVE_VASPRINTF
 +
 +int
 +vasprintf (char **buf, const char *fmt, va_list ap)
 +{
 +  /* Should be large enough.  */
 +  *buf = xmalloc (512);
 +
 +  return vsprintf (*buf, fmt, ap);
 +}
 +
 +#endif
 +
 +#ifndef  HAVE_ASPRINTF
 +
 +int
 +asprintf (char **buf, const char *fmt, ...)
 +{
 +  int status;
 +  va_list ap;
 +
 +  va_start (ap, fmt);
 +  status = vasprintf (*buf, fmt, ap);
 +  va_end (ap);
 +
 +  return status;
 +}
 +
 +#endif
 +
 +char *
 +xasprintf (const char *fmt, ...)
 +{ 
 +  va_list ap;
 +  char *result;
 +  
 +  va_start (ap, fmt);
 +  if (vasprintf (&result, fmt, ap) < 0)
 +    { 
 +      if (errno == ENOMEM)
 +        grub_util_error ("out of memory");
 +      return NULL;
 +    }
 +  
 +  return result;
 +}
 +
 +void
 +grub_exit (void)
 +{
 +  exit (1);
 +}
 +
 +grub_uint64_t
 +grub_get_time_ms (void)
 +{
 +  struct timeval tv;
 +
 +  gettimeofday (&tv, 0);
 +
 +  return (tv.tv_sec * 1000 + tv.tv_usec / 1000);
 +}
 +
 +grub_uint32_t
 +grub_get_rtc (void)
 +{
 +  struct timeval tv;
 +
 +  gettimeofday (&tv, 0);
 +
 +  return (tv.tv_sec * GRUB_TICKS_PER_SECOND
 +        + (((tv.tv_sec % GRUB_TICKS_PER_SECOND) * 1000000 + tv.tv_usec)
 +           * GRUB_TICKS_PER_SECOND / 1000000));
 +}
++
++
++/* This function never prints trailing slashes (so that its output
++   can be appended a slash unconditionally).  */
++char *
++grub_make_system_path_relative_to_its_root (const char *path)
++{
++  struct stat st;
++  char *p, *buf, *buf2, *buf3;
++  uintptr_t offset = 0;
++  dev_t num;
++  size_t len;
++
++  /* canonicalize.  */
++  p = canonicalize_file_name (path);
++
++  if (p == NULL)
++    grub_util_error ("failed to get canonical path of %s", path);
++
++  len = strlen (p) + 1;
++  buf = xstrdup (p);
++  free (p);
++
++  if (stat (buf, &st) < 0)
++    grub_util_error ("cannot stat %s: %s", buf, strerror (errno));
++
++  buf2 = xstrdup (buf);
++  num = st.st_dev;
++
++  /* This loop sets offset to the number of chars of the root
++     directory we're inspecting.  */
++  while (1)
++    {
++      p = strrchr (buf, '/');
++      if (p == NULL)
++      /* This should never happen.  */
++      grub_util_error ("FIXME: no / in buf. (make_system_path_relative_to_its_root)");
++      if (p != buf)
++      *p = 0;
++      else
++      *++p = 0;
++
++      if (stat (buf, &st) < 0)
++      grub_util_error ("cannot stat %s: %s", buf, strerror (errno));
++
++      /* buf is another filesystem; we found it.  */
++      if (st.st_dev != num)
++      {
++        /* offset == 0 means path given is the mount point.
++           This works around special-casing of "/" in Un*x.  This function never
++           prints trailing slashes (so that its output can be appended a slash
++           unconditionally).  Each slash in is considered a preceding slash, and
++           therefore the root directory is an empty string.  */
++        if (offset == 0)
++          {
++            free (buf);
++            free (buf2);
++            return xstrdup ("");
++          }
++        else
++          break;
++      }
++
++      offset = p - buf;
++      /* offset == 1 means root directory.  */
++      if (offset == 1)
++      {
++        /* Include leading slash.  */
++        offset = 0;
++        break;
++      }
++    }
++  free (buf);
++  buf3 = xstrdup (buf2 + offset);
++  free (buf2);
++
++#ifdef __CYGWIN__
++  if (st.st_dev != (DEV_CYGDRIVE_MAJOR << 16))
++    {
++      /* Reached some mount point not below /cygdrive.
++       GRUB does not know Cygwin's emulated mounts,
++       convert to Win32 path.  */
++      grub_util_info ("Cygwin path = %s\n", buf3);
++      char * temp = get_win32_path (buf3);
++      free (buf3);
++      buf3 = temp;
++    }
++#endif
++
++  /* Remove trailing slashes, return empty string if root directory.  */
++  len = strlen (buf3);
++  while (len > 0 && buf3[len - 1] == '/')
++    {
++      buf3[len - 1] = '\0';
++      len--;
++    }
++
++  return buf3;
++}
index c26fa7b67f70454ea5de26750062bd006a4c01ff,327f0c866c22f4287d81e34cad53f3df0fe60f6a..e771bd8735bc2626448d89f11997ed9c360d97b8
@@@ -17,8 -17,7 +17,9 @@@
   *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
   */
  
 +#include <stdio.h>
  #include <grub/util/misc.h>
++#include <grub/emu/misc.h>
  #include <grub/i18n.h>
  #include <getopt.h>
  
@@@ -98,7 -97,7 +99,7 @@@ main (int argc, char *argv[]
  
    argument = argv[optind];
  
--  relpath = make_system_path_relative_to_its_root (argument);
++  relpath = grub_make_system_path_relative_to_its_root (argument);
    printf ("%s\n", relpath);
    free (relpath);
  
index add942fb4e366f7a09861da3b5441ab7107615e1,bb41480e2cbfe2d68b7cefa82e850457dd75fa6e..1f956efb739708d40166612bd071168a781fa54b
@@@ -262,7 -261,7 +262,7 @@@ probe (const char *path, char *device_n
              grub_util_info ("reading %s via OS facilities", path);
              filebuf_via_sys = grub_util_read_image (path);
  
--            rel_path = make_system_path_relative_to_its_root (path);
++            rel_path = grub_make_system_path_relative_to_its_root (path);
              grub_path = xasprintf ("(%s)%s", drive_name, rel_path);
              free (rel_path);
              grub_util_info ("reading %s via GRUB facilities", grub_path);
diff --cc util/misc.c
index d26e51bbf77c841873d348f91850aeb6e0604fc1,f9d860d9adf28d5743fb65821d4e607df11893c4..1656d6b5bf50ffad4af63c30aed8d43cb10bde7c
@@@ -299,103 -461,125 +304,27 @@@ canonicalize_file_name (const char *pat
    return ret;
  }
  
- /* This function never prints trailing slashes (so that its output
-    can be appended a slash unconditionally).  */
- char *
- make_system_path_relative_to_its_root (const char *path)
+ #ifdef __CYGWIN__
+ /* Convert POSIX path to Win32 path,
+    remove drive letter, replace backslashes.  */
+ static char *
+ get_win32_path (const char *path)
  {
-   struct stat st;
-   char *p, *buf, *buf2, *buf3;
-   uintptr_t offset = 0;
-   dev_t num;
-   size_t len;
-   /* canonicalize.  */
-   p = canonicalize_file_name (path);
-   if (p == NULL)
-     grub_util_error ("failed to get canonical path of %s", path);
-   len = strlen (p) + 1;
-   buf = xstrdup (p);
-   free (p);
-   if (stat (buf, &st) < 0)
-     grub_util_error ("cannot stat %s: %s", buf, strerror (errno));
-   buf2 = xstrdup (buf);
-   num = st.st_dev;
-   /* This loop sets offset to the number of chars of the root
-      directory we're inspecting.  */
-   while (1)
-     {
-       p = strrchr (buf, '/');
-       if (p == NULL)
-       /* This should never happen.  */
-       grub_util_error ("FIXME: no / in buf. (make_system_path_relative_to_its_root)");
-       if (p != buf)
-       *p = 0;
-       else
-       *++p = 0;
-       if (stat (buf, &st) < 0)
-       grub_util_error ("cannot stat %s: %s", buf, strerror (errno));
-       /* buf is another filesystem; we found it.  */
-       if (st.st_dev != num)
-       {
-         /* offset == 0 means path given is the mount point.
-            This works around special-casing of "/" in Un*x.  This function never
-            prints trailing slashes (so that its output can be appended a slash
-            unconditionally).  Each slash in is considered a preceding slash, and
-            therefore the root directory is an empty string.  */
-         if (offset == 0)
-           {
-             free (buf);
-             free (buf2);
-             return xstrdup ("");
-           }
-         else
-           break;
-       }
-       offset = p - buf;
-       /* offset == 1 means root directory.  */
-       if (offset == 1)
-       {
-         free (buf);
-         len = strlen (buf2);
-         while (buf2[len - 1] == '/' && len > 1)
-           {
-             buf2[len - 1] = '\0';
-             len--;
-           }
-         if (len > 1)
-           return buf2;
-         else
-           {
-             /* This means path given is just a backslash.  As above
-                we have to return an empty string.  */
-             free (buf2);
-             return xstrdup ("");
-           }
-       }
-     }
-   free (buf);
-   buf3 = xstrdup (buf2 + offset);
-   free (buf2);
-   len = strlen (buf3);
-   while (buf3[len - 1] == '/' && len > 1)
-     {
-       buf3[len - 1] = '\0';
-       len--;
-     }
-   return buf3;
+   char winpath[PATH_MAX];
+   if (cygwin_conv_path (CCP_POSIX_TO_WIN_A, path, winpath, sizeof(winpath)))
+     grub_util_error ("cygwin_conv_path() failed");
+   int len = strlen (winpath);
+   int offs = (len > 2 && winpath[1] == ':' ? 2 : 0);
+   int i;
+   for (i = offs; i < len; i++)
+     if (winpath[i] == '\\')
+       winpath[i] = '/';
+   return xstrdup (winpath + offs);
  }
+ #endif
  
 -/* This function never prints trailing slashes (so that its output
 -   can be appended a slash unconditionally).  */
 -char *
 -make_system_path_relative_to_its_root (const char *path)
 -{
 -  struct stat st;
 -  char *p, *buf, *buf2, *buf3;
 -  uintptr_t offset = 0;
 -  dev_t num;
 -  size_t len;
 -
 -  /* canonicalize.  */
 -  p = canonicalize_file_name (path);
 -
 -  if (p == NULL)
 -    grub_util_error ("failed to get canonical path of %s", path);
 -
 -  len = strlen (p) + 1;
 -  buf = xstrdup (p);
 -  free (p);
 -
 -  if (stat (buf, &st) < 0)
 -    grub_util_error ("cannot stat %s: %s", buf, strerror (errno));
 -
 -  buf2 = xstrdup (buf);
 -  num = st.st_dev;
 -
 -  /* This loop sets offset to the number of chars of the root
 -     directory we're inspecting.  */
 -  while (1)
 -    {
 -      p = strrchr (buf, '/');
 -      if (p == NULL)
 -      /* This should never happen.  */
 -      grub_util_error ("FIXME: no / in buf. (make_system_path_relative_to_its_root)");
 -      if (p != buf)
 -      *p = 0;
 -      else
 -      *++p = 0;
 -
 -      if (stat (buf, &st) < 0)
 -      grub_util_error ("cannot stat %s: %s", buf, strerror (errno));
 -
 -      /* buf is another filesystem; we found it.  */
 -      if (st.st_dev != num)
 -      {
 -        /* offset == 0 means path given is the mount point.
 -           This works around special-casing of "/" in Un*x.  This function never
 -           prints trailing slashes (so that its output can be appended a slash
 -           unconditionally).  Each slash in is considered a preceding slash, and
 -           therefore the root directory is an empty string.  */
 -        if (offset == 0)
 -          {
 -            free (buf);
 -            free (buf2);
 -            return xstrdup ("");
 -          }
 -        else
 -          break;
 -      }
 -
 -      offset = p - buf;
 -      /* offset == 1 means root directory.  */
 -      if (offset == 1)
 -      {
 -        /* Include leading slash.  */
 -        offset = 0;
 -        break;
 -      }
 -    }
 -  free (buf);
 -  buf3 = xstrdup (buf2 + offset);
 -  free (buf2);
 -
 -#ifdef __CYGWIN__
 -  if (st.st_dev != (DEV_CYGDRIVE_MAJOR << 16))
 -    {
 -      /* Reached some mount point not below /cygdrive.
 -       GRUB does not know Cygwin's emulated mounts,
 -       convert to Win32 path.  */
 -      grub_util_info ("Cygwin path = %s\n", buf3);
 -      char * temp = get_win32_path (buf3);
 -      free (buf3);
 -      buf3 = temp;
 -    }
 -#endif
 -
 -  /* Remove trailing slashes, return empty string if root directory.  */
 -  len = strlen (buf3);
 -  while (len > 0 && buf3[len - 1] == '/')
 -    {
 -      buf3[len - 1] = '\0';
 -      len--;
 -    }
 -
 -  return buf3;
 -}
 -
  #ifdef GRUB_UTIL
  void
  grub_util_init_nls (void)