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 21:30:07 +0300
User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.6) Gecko/20040113

Jeroen Dekkers wrote:

You removed the fail: label from the __linux__ code, please add it back.

Accidently. First I wanted to move it after #endif but after awhile I understood why it was there but forgot to take it back.
Fixed.

This is not correct. GNU doesn't use /dev/ad and /dev/wd. You should
do the check for /dev/ad and /dev/wd only when !__GNU__.

You're absolutely right. Fixed.

I think it's better to just use
pupa_util_error ("memalign not available")

instead of malloc(). pupa_memalign() isn't used now, so it's not
really a big problem, but when it is used, the memory must be
aligned. If the memory isn't aligned when it needs to be that can
cause subtle and hard to debug bugs. It is better to fail loudly.


I'm not sure here. Developer who will add using of pupa_memalign() on linux could never see the message. So he'll silently break utils on some other platforms.

PS. My first patch was quite draft. I was not sure in many details so I wanted to see your comments. I did. Thanks to all. Here is a next patch. (The last one I hope :)
--
Sem.
diff -ruNp grub2/ChangeLog grub2.test/ChangeLog
--- grub2/ChangeLog     Fri Mar 19 23:55:21 2004
+++ grub2.test/ChangeLog        Sat Mar 20 20:57:56 2004
@@ -1,3 +1,21 @@
+2004-03-15  Sergey Matveychuk  <address@hidden>
+
+       * configure.ac: Added detection of malloc.h and memalign().
+       * util/i386/pc/biosdisk.c: Added sys/ioctl.h, sys/disklabel.h for
+       BSD, sys/param.h for FreeBSD and sys/disk.h for FreeBSD 5.x.
+       (pupa_util_biosdisk_open): Added getting a device size for BSD.
+       (get_os_disk): Use code for __GNU__ for BSD too.
+       Change strchr() with strrchr() to fix working with 'sd' disk names.
+       [!__GNU__]: Add recognizing of 'ad' and 'wd' disk names.
+       (pupa_util_biosdisk_get_pupa_dev): Remove call make_device_name()
+       if file is not a block device.
+       * util/i386/pc/getroot.c (find_root_device): Do not check for a block
+       device.
+       * util/misc.c: Include config.h. 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/configure.ac grub2.test/configure.ac
--- grub2/configure.ac  Fri Mar 19 23:55:24 2004
+++ grub2.test/configure.ac     Sat Mar 20 01:40:52 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/stamp-h grub2.test/stamp-h
--- grub2/stamp-h       Thu Jan  1 03:00:00 1970
+++ grub2.test/stamp-h  Sat Mar 20 01:41:16 2004
@@ -0,0 +1 @@
+timestamp
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 21:05:00 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,48 @@ pupa_util_biosdisk_open (const char *nam
     
     return PUPA_ERR_NONE;
   }
+ fail:
+#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 +712,15 @@ 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);
+#ifdef __GNU__
   if (strncmp ("/dev/sd", path, 7) == 0 || strncmp ("/dev/hd", path, 7) == 0)
+#else
+  if (strncmp ("/dev/ad", path, 7) == 0 || strncmp ("/dev/wd", path, 7) == 0)
+#endif
     {
-      p = strchr (path, 's');
+      p = strrchr (path, 's');
       if (p)
        *p = '\0';
     }
@@ -716,9 +773,6 @@ pupa_util_biosdisk_get_pupa_dev (const c
       return 0;
     }
   
-  if (! S_ISBLK (st.st_mode))
-    return make_device_name (drive, -1, -1);
-  
 #if defined(__linux__)
   /* Linux counts partitions uniformly, whether a BSD partition or a DOS
      partition, so mapping them to PUPA devices is not trivial.
@@ -806,8 +860,9 @@ pupa_util_biosdisk_get_pupa_dev (const c
     return make_device_name (drive, dos_part, bsd_part);
   }
   
-#elif defined(__GNU__)
+#elif defined(__GNU__) || defined(__FreeBSD__) || defined(__NetBSD__) || 
defined(__OpenBSD__)
   /* GNU uses "/dev/[hs]d[0-9]+(s[0-9]+[a-z]?)?".  */
+  /* BSD uses "/dev/[aw]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 21:03:29 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
@@ -178,7 +178,7 @@ find_root_device (const char *dir, dev_t
            }
        }
 
-      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 02:23:44 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 02:23:52 2004
@@ -18,7 +18,9 @@
  */
 
 #include <stdlib.h>
+#ifdev 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]