From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by monty-python.gnu.org with archive (Exim 4.30) id 1B3skd-0004iJ-LY for mharc-grub-devel@gnu.org; Thu, 18 Mar 2004 03:19:39 -0500 Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.30) id 1B3sk9-0004Xs-Es for grub-devel@gnu.org; Thu, 18 Mar 2004 03:19:09 -0500 Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.30) id 1B3sjc-0004P1-Ga for grub-devel@gnu.org; Thu, 18 Mar 2004 03:19:07 -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 1B3sgt-0003ri-ST for grub-devel@gnu.org; Thu, 18 Mar 2004 03:15:48 -0500 Received: from ppp139-19.dialup.mtu-net.ru ([62.118.139.19] helo=ciam.ru) by mail.ciam.ru with esmtp (Exim 4.x) id 1B3sgf-000MfQ-TE for grub-devel@gnu.org; Thu, 18 Mar 2004 11:15:34 +0300 Message-ID: <40595AA3.6000800@ciam.ru> Date: Thu, 18 Mar 2004 11:15:31 +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: grub-devel@gnu.org Content-Type: multipart/mixed; boundary="------------060808050206040508090005" X-Spam-Score: 2.6 (++) Subject: 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: Thu, 18 Mar 2004 08:19:28 -0000 This is a multi-part message in MIME format. --------------060808050206040508090005 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Here is a patch with *BSD stuff. Also I've moved pupa_util_biosdisk_init() above pupa_guess_root_device() in util/pupa-emu.c because of pupa_guess_root_device() use parsed device.map but reading and parsing do in pupa_util_biosdisk_init(). I've tested the patch buth FreeBSD 4.x and 5.x. It should be tested on NetBSD and OpenBSD also. -- Sem. --------------060808050206040508090005 Content-Type: text/plain; name="grub2-bsd.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="grub2-bsd.patch" diff -ruN grub2/ChangeLog grub2.devel/ChangeLog --- grub2/ChangeLog Tue Mar 16 02:23:55 2004 +++ grub2.devel/ChangeLog Thu Mar 18 10:54:14 2004 @@ -1,3 +1,17 @@ +2004-03-15 Sergey Matveychuk + + * util/i386/pc/biosdisk.c: Add *BSD stuff. + (get_os_disk): Change strchr() with strrchr() to fix working with + sd* disk names. + * grub2/util/i386/pc/getroot.c: Update copyright. + (find_root_device) [__FreeBSD__]: Do not check for a block device. + * util/misc.c [__FreeBSD__]: Do not include malloc.h. + Change memalign() with malloc(). + * util/pupa-emu.c: + [__FreeBSD__]: Do not include malloc.h. + (main): Move pupa_util_biosdisk_init() above pupa_guess_root_device(). + * util/pupa-setup.c [__FreeBSD__]: Do not include malloc.h. + 2004-03-14 Jeroen Dekkers * Makefile.in: Update copyright. diff -ruN grub2/util/i386/pc/biosdisk.c grub2.devel/util/i386/pc/biosdisk.c --- grub2/util/i386/pc/biosdisk.c Tue Mar 16 02:24:00 2004 +++ grub2.devel/util/i386/pc/biosdisk.c Tue Mar 16 04:25:21 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,66 @@ return PUPA_ERR_NONE; } +#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) + { + int fd; + struct disklabel hdg; + + fd = open (map[drive], O_RDONLY); + if (fd < 0) + return pupa_error (PUPA_ERR_BAD_DEVICE, "cannot open `%s'", map[drive]); + +#if !defined(__FreeBSD__) + if (fstat (fd, &st) < 0 || ! S_ISBLK (st.st_mode)) +#else + if (fstat (fd, &st) < 0) +#endif + { + close (fd); + goto fail; + } + +#if !defined(__FreeBSD__) || __FreeBSD_version < 500040 + if (ioctl (fd, DIOCGDINFO, &hdg)) + goto fail; + + disk->total_sectors = hdg.d_secperunit; +#else + u_int u, secsize; + off_t mediasize; + + if(ioctl(fd, DIOCGSECTORSIZE, &secsize) != 0) + secsize = 512; + + if (ioctl(fd, DIOCGMEDIASIZE, &mediasize) != 0) + goto fail; + + hdg.d_secperunit = mediasize / secsize; + + if (ioctl(fd, DIOCGFWSECTORS, &u) == 0) + hdg.d_nsectors = u; + else + hdg.d_nsectors = 63; + if (ioctl(fd, DIOCGFWHEADS, &u) == 0) + hdg.d_ntracks = u; + else if (hdg.d_secperunit <= 63*1*1024) + hdg.d_ntracks = 1; + else if (hdg.d_secperunit <= 63*16*1024) + hdg.d_ntracks = 16; + else + hdg.d_ntracks = 255; + hdg.d_secpercyl = hdg.d_ntracks * hdg.d_nsectors; + hdg.d_ncylinders = hdg.d_secperunit / hdg.d_secpercyl; + + disk->total_sectors = hdg.d_secperunit; + +#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 +730,12 @@ 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 +788,10 @@ 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 +880,8 @@ 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 -ruN grub2/util/i386/pc/getroot.c grub2.devel/util/i386/pc/getroot.c --- grub2/util/i386/pc/getroot.c Sun Mar 14 05:44:20 2004 +++ grub2.devel/util/i386/pc/getroot.c Tue Mar 16 03:20:05 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,12 @@ return res; } } - + /* On last FreeBSDs there are no block devices */ +#if !defined(__FreeBSD__) if (S_ISBLK (st.st_mode) && st.st_rdev == dev) +#else + if (st.st_rdev == dev) +#endif { /* Found! */ char *res; diff -ruN grub2/util/i386/pc/pupa-setup.c grub2.devel/util/i386/pc/pupa-setup.c --- grub2/util/i386/pc/pupa-setup.c Tue Mar 16 02:24:05 2004 +++ grub2.devel/util/i386/pc/pupa-setup.c Tue Mar 16 03:23:23 2004 @@ -1,7 +1,7 @@ /* pupa-setup.c - make PUPA usable */ /* * PUPA -- Preliminary Universal Programming Architecture for GRUB - * Copyright (C) 1999,2000,2001,2002,2003,2004 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 diff -ruN grub2/util/misc.c grub2.devel/util/misc.c --- grub2/util/misc.c Sun Mar 14 05:44:20 2004 +++ grub2.devel/util/misc.c Mon Mar 15 20:14:40 2004 @@ -24,7 +24,9 @@ #include #include #include +#if !defined(__FreeBSD__) #include +#endif #include #include @@ -194,7 +196,11 @@ { void *p; +#if !defined(__FreeBSD__) p = memalign (align, size); +#else + p = malloc(size); +#endif if (! p) pupa_util_error ("out of memory"); diff -ruN grub2/util/pupa-emu.c grub2.devel/util/pupa-emu.c --- grub2/util/pupa-emu.c Tue Mar 16 02:24:00 2004 +++ grub2.devel/util/pupa-emu.c Tue Mar 16 03:24:48 2004 @@ -18,7 +18,9 @@ */ #include +#if !defined(__FreeBSD__) #include +#endif #include #include #include @@ -135,6 +137,8 @@ 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 @@ 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 (); --------------060808050206040508090005--