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 ();