grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: GRUB2: *BSD and more patch


From: Sergey Matveychuk
Subject: Re: GRUB2: *BSD and more patch
Date: Sat, 20 Mar 2004 02:24:28 +0300
User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.6) Gecko/20040113

Here is a third version.

--
Sem.
diff -ruNp grub2/ChangeLog grub2.test/ChangeLog
--- grub2/ChangeLog     Fri Mar 19 23:55:21 2004
+++ grub2.test/ChangeLog        Sat Mar 20 01:38:47 2004
@@ -1,3 +1,19 @@
+2004-03-15  Sergey Matveychuk  <address@hidden>
+
+       * util/i386/pc/biosdisk.c: Added headers for BSD.
+       (pupa_util_biosdisk_open): Added getting a device size for BSD.
+       (get_os_disk): Use code for __GNU__ for BSD too. Add recognizing of
+       'ad' and 'wd' disk names. Change strchr() with strrchr() to fix working
+       with 'sd' disk names.
+       (pupa_util_biosdisk_get_pupa_dev): Do not call
+       make_device_name(drive,-1-1) if not a block device.
+       * util/i386/pc/getroot.c: Update copyright.
+       (find_root_device): Do not check for a block device.
+       * util/misc.c: Include malloc.h only if it's needed.
+       (pupa_memalign): Change memalign() with malloc() where unavailable.
+       * util/pupa-emu.c: Include malloc.h only if it's needed.
+       (main): Move pupa_util_biosdisk_init() above pupa_guess_root_device().
+
 2004-03-14  Jeroen Dekkers  <address@hidden>
 
        * Makefile.in: Update copyright.
diff -ruNp grub2/config.h.in grub2.test/config.h.in
--- grub2/config.h.in   Fri Mar 19 23:55:22 2004
+++ grub2.test/config.h.in      Sat Mar 20 01:26:45 2004
@@ -4,13 +4,13 @@
    prefixed with an asterisk */
 #undef ABSOLUTE_WITHOUT_ASTERISK
 
-/* Define it to \"addr32\" or \"addr32;\" to make GAS happy */
+/* Define it to "addr32" or "addr32;" to make GAS happy */
 #undef ADDR32
 
 /* Define it to one of __bss_start, edata and _edata */
 #undef BSS_START_SYMBOL
 
-/* Define it to \"data32\" or \"data32;\" to make GAS happy */
+/* Define it to "data32" or "data32;" to make GAS happy */
 #undef DATA32
 
 /* Define it to either end or _end */
diff -ruNp grub2/configure.ac grub2.test/configure.ac
--- grub2/configure.ac  Fri Mar 19 23:55:24 2004
+++ grub2.test/configure.ac     Sat Mar 20 01:21:36 2004
@@ -78,6 +78,9 @@ if test "x$default_CFLAGS" = xyes; then
 fi
 AC_SUBST(CFLAGS)
 
+AC_CHECK_HEADER(malloc.h)
+AC_CHECK_FUNC(memalign)
+
 # Defined in aclocal.m4.
 pupa_ASM_USCORE
 pupa_CHECK_START_SYMBOL
diff -ruNp grub2/util/i386/pc/biosdisk.c grub2.test/util/i386/pc/biosdisk.c
--- grub2/util/i386/pc/biosdisk.c       Sun Mar 14 20:48:25 2004
+++ grub2.test/util/i386/pc/biosdisk.c  Sat Mar 20 01:27:40 2004
@@ -37,6 +37,17 @@
 #include <errno.h>
 #include <limits.h>
 
+#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
+# include <sys/ioctl.h>                /* ioctl */
+# include <sys/disklabel.h>
+# if defined(__FreeBSD__)
+#  include <sys/param.h>
+#  if __FreeBSD_version >= 500040
+#   include <sys/disk.h>
+#  endif
+# endif
+#endif /* __FreeBSD__ || __NetBSD__ || __OpenBSD__ */
+
 #ifdef __linux__
 # include <sys/ioctl.h>         /* ioctl */
 # if !defined(__GLIBC__) || \
@@ -190,6 +201,47 @@ pupa_util_biosdisk_open (const char *nam
     
     return PUPA_ERR_NONE;
   }
+#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
+  {
+    int fd;
+
+    fd = open (map[drive], O_RDONLY);
+    if (fd < 0)
+      return pupa_error (PUPA_ERR_BAD_DEVICE, "cannot open `%s'", map[drive]);
+
+    if (fstat (fd, &st) < 0)
+      {
+       close (fd);
+       goto fail;
+      }
+    
+#if !defined(__FreeBSD__) || __FreeBSD_version < 500040
+    {
+      struct disklabel hdg;
+      if (ioctl (fd, DIOCGDINFO, &hdg))
+        goto fail;
+    
+      disk->total_sectors = hdg.d_secperunit;
+    }
+#else
+    u_int    secsize;
+    off_t    mediasize;
+
+    if(ioctl(fd, DIOCGSECTORSIZE, &secsize) != 0)
+       secsize = 512;
+
+    if (ioctl(fd, DIOCGMEDIASIZE, &mediasize) != 0)
+       goto fail;
+
+    disk->total_sectors = mediasize / secsize;
+#endif
+
+    close (fd);
+  }
+    
+    pupa_util_info ("the size of %s is %lu", name, disk->total_sectors);
+    
+    return PUPA_ERR_NONE;
 
  fail:
   /* In GNU/Hurd, stat() will return the right size.  */
@@ -659,11 +711,12 @@ get_os_disk (const char *os_dev)
 
   return path;
   
-#elif defined(__GNU__)
+#elif defined(__GNU__) || defined(__FreeBSD__) || defined(__NetBSD__) || 
defined(__OpenBSD__)
   path = xstrdup (os_dev);
-  if (strncmp ("/dev/sd", path, 7) == 0 || strncmp ("/dev/hd", path, 7) == 0)
+  if (strncmp ("/dev/sd", path, 7) == 0 || strncmp ("/dev/hd", path, 7) == 0
+   || strncmp ("/dev/ad", path, 7) == 0 || strncmp ("/dev/wd", path, 7) == 0)
     {
-      p = strchr (path, 's');
+      p = strrchr (path, 's');
       if (p)
        *p = '\0';
     }
@@ -716,8 +769,10 @@ pupa_util_biosdisk_get_pupa_dev (const c
       return 0;
     }
   
+#if !defined(__FreeBSD__)
   if (! S_ISBLK (st.st_mode))
     return make_device_name (drive, -1, -1);
+#endif
   
 #if defined(__linux__)
   /* Linux counts partitions uniformly, whether a BSD partition or a DOS
@@ -806,8 +861,8 @@ pupa_util_biosdisk_get_pupa_dev (const c
     return make_device_name (drive, dos_part, bsd_part);
   }
   
-#elif defined(__GNU__)
-  /* GNU uses "/dev/[hs]d[0-9]+(s[0-9]+[a-z]?)?".  */
+#elif defined(__GNU__) || defined(__FreeBSD__) || defined(__NetBSD__) || 
defined(__OpenBSD__)
+  /* GNU uses "/dev/[ahsw]d[0-9]+(s[0-9]+[a-z]?)?".  */
   {
     char *p;
     int dos_part = -1;
diff -ruNp grub2/util/i386/pc/getroot.c grub2.test/util/i386/pc/getroot.c
--- grub2/util/i386/pc/getroot.c        Sat Mar 13 16:59:25 2004
+++ grub2.test/util/i386/pc/getroot.c   Sat Mar 20 00:05:26 2004
@@ -1,7 +1,7 @@
 /* getroot.c - Get root device */
 /*
  *  PUPA  --  Preliminary Universal Programming Architecture for GRUB
- *  Copyright (C) 1999,2000,2001,2002,2003  Free Software Foundation, Inc.
+ *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
  *
  *  PUPA is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -177,8 +177,7 @@ find_root_device (const char *dir, dev_t
              return res;
            }
        }
-
-      if (S_ISBLK (st.st_mode) && st.st_rdev == dev)
+      if (st.st_rdev == dev)
        {
          /* Found!  */
          char *res;
diff -ruNp grub2/util/misc.c grub2.test/util/misc.c
--- grub2/util/misc.c   Sat Mar 13 16:59:25 2004
+++ grub2.test/util/misc.c      Sat Mar 20 01:25:31 2004
@@ -17,6 +17,7 @@
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
+#include <config.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdarg.h>
@@ -24,7 +25,9 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/times.h>
+#ifdef HAVE_MALLOC_H
 #include <malloc.h>
+#endif
 
 #include <pupa/util/misc.h>
 #include <pupa/mm.h>
@@ -194,7 +197,11 @@ pupa_memalign (pupa_size_t align, pupa_s
 {
   void *p;
   
+#ifdef HAVE_MEMALIGN
   p = memalign (align, size);
+#else
+  p = malloc(size);
+#endif
   if (! p)
     pupa_util_error ("out of memory");
   
diff -ruNp grub2/util/pupa-emu.c grub2.test/util/pupa-emu.c
--- grub2/util/pupa-emu.c       Sat Mar 13 16:59:25 2004
+++ grub2.test/util/pupa-emu.c  Sat Mar 20 01:25:51 2004
@@ -18,7 +18,9 @@
  */
 
 #include <stdlib.h>
+#ifdef HAVE_MALLOC_H
 #include <malloc.h>
+#endif
 #include <sys/stat.h>
 #include <argp.h>
 #include <string.h>
@@ -135,6 +137,8 @@ main (int argc, char *argv[])
 
   argp_parse (&argp, argc, argv, 0, 0, &args);
 
+  /* XXX: This is a bit unportable.  */
+  pupa_util_biosdisk_init (args.dev_map);
   /* More sure there is a root device.  */
   if (! args.root_dev)
     {
@@ -152,9 +156,6 @@ main (int argc, char *argv[])
 
   pupa_env_set ("prefix", rootprefix);
   
-  /* XXX: This is a bit unportable.  */
-  pupa_util_biosdisk_init (args.dev_map);
-
   /* Initialize the default modules.  */
   pupa_fat_init ();
   pupa_ext2_init ();

reply via email to

[Prev in Thread] Current Thread [Next in Thread]