From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by monty-python.gnu.org with archive (Exim 4.30) id 1B4lFB-0003EG-Ky for mharc-grub-devel@gnu.org; Sat, 20 Mar 2004 13:30:49 -0500 Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.30) id 1B4lF9-0003DB-8F for grub-devel@gnu.org; Sat, 20 Mar 2004 13:30:47 -0500 Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.30) id 1B4lEc-000367-Mg for grub-devel@gnu.org; Sat, 20 Mar 2004 13:30:45 -0500 Received: from [213.147.57.66] (helo=mail.ciam.ru) by monty-python.gnu.org with esmtp (TLSv1:DES-CBC3-SHA:168) (Exim 4.30) id 1B4lEb-000358-R6 for grub-devel@gnu.org; Sat, 20 Mar 2004 13:30:14 -0500 Received: from ppp9-143.pppoe.mtu-net.ru ([81.195.9.143] helo=ciam.ru) by mail.ciam.ru with esmtp (Exim 4.x) id 1B4lEL-0009tb-Pz for grub-devel@gnu.org; Sat, 20 Mar 2004 21:29:57 +0300 Message-ID: <405C8DAF.5050705@ciam.ru> Date: Sat, 20 Mar 2004 21:30:07 +0300 From: Sergey Matveychuk User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.6) Gecko/20040113 X-Accept-Language: en-us, en MIME-Version: 1.0 To: The development of GRUB 2 References: <40595AA3.6000800@ciam.ru> <200403181331.51694.okuji@enbug.org> <405B64FB.4020109@ciam.ru> <87ish0cy4z.fsf@marco.marco-g.com> <405B6C8E.8070108@ciam.ru> <87ad2ccwaf.fsf@marco.marco-g.com> <405B812C.7080301@ciam.ru> <87wu5gbddz.fsf@marco.marco-g.com> <405B942B.4000001@ciam.ru> <20040320102929.GA1525@dekkers.cx> In-Reply-To: <20040320102929.GA1525@dekkers.cx> Content-Type: multipart/mixed; boundary="------------060002010306050302060005" X-Spam-Score: 2.6 (++) Subject: Re: GRUB2: *BSD and more patch X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.4 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: Sat, 20 Mar 2004 18:30:48 -0000 This is a multi-part message in MIME format. --------------060002010306050302060005 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit 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. --------------060002010306050302060005 Content-Type: text/plain; name="grub2-bsd.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="grub2-bsd.patch" 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 + + * 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 * 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 #include +#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) +# include /* ioctl */ +# include +# if defined(__FreeBSD__) +# include +# if __FreeBSD_version >= 500040 +# include +# endif +# endif +#endif /* __FreeBSD__ || __NetBSD__ || __OpenBSD__ */ + #ifdef __linux__ # include /* 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 #include #include #include @@ -24,7 +25,9 @@ #include #include #include +#ifdef HAVE_MALLOC_H #include +#endif #include #include @@ -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 +#ifdev HAVE_MALLOC_H #include +#endif #include #include #include @@ -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 (); --------------060002010306050302060005--