Add haiku-specific functions.
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sat, 19 Oct 2013 14:39:38 +0000 (16:39 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sat, 19 Oct 2013 14:39:38 +0000 (16:39 +0200)
ChangeLog
conf/Makefile.extra-dist
grub-core/osdep/getroot.c
grub-core/osdep/haiku/getroot.c [new file with mode: 0644]
grub-core/osdep/haiku/hostdisk.c [new file with mode: 0644]
grub-core/osdep/hostdisk.c
grub-core/osdep/unix/getroot.c
grub-core/osdep/unix/relpath.c
include/grub/osdep/hostfile_unix.h

index f940a66..5e422bf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2013-10-19  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       Add haiku-specific functions.
+
 2013-10-19  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * grub-core/kern/emu/hostdisk.c: Remove few leftover includes.
index c8413da..bf52487 100644 (file)
@@ -71,6 +71,7 @@ EXTRA_DIST += grub-core/osdep/hurd/hostdisk.c
 EXTRA_DIST += grub-core/osdep/linux/hostdisk.c
 EXTRA_DIST += grub-core/osdep/windows/hostdisk.c
 EXTRA_DIST += grub-core/osdep/sun/hostdisk.c
+EXTRA_DIST += grub-core/osdep/haiku/hostdisk.c
 
 EXTRA_DIST += grub-core/osdep/basic/init.c
 EXTRA_DIST += grub-core/osdep/windows/init.c
@@ -84,6 +85,7 @@ EXTRA_DIST += grub-core/osdep/freebsd/getroot.c
 EXTRA_DIST += grub-core/osdep/hurd/getroot.c
 EXTRA_DIST += grub-core/osdep/linux/getroot.c
 EXTRA_DIST += grub-core/osdep/sun/getroot.c
+EXTRA_DIST += grub-core/osdep/haiku/getroot.c
 
 EXTRA_DIST += grub-core/osdep/basic/random.c
 EXTRA_DIST += grub-core/osdep/basic/ofpath.c
index 6392a29..69a80e9 100644 (file)
@@ -14,6 +14,8 @@
 #include "windows/getroot.c"
 #elif defined(__AROS__)
 #include "aros/getroot.c"
+#elif defined (__HAIKU__)
+#include "haiku/getroot.c"
 #else
 # warning "No getroot OS-specific functions is available for your system. Device detection may not work properly."
 #include "basic/getroot.c"
diff --git a/grub-core/osdep/haiku/getroot.c b/grub-core/osdep/haiku/getroot.c
new file mode 100644 (file)
index 0000000..0852c5e
--- /dev/null
@@ -0,0 +1,105 @@
+#include <config.h>
+#include <config-util.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <string.h>
+#include <errno.h>
+#include <stdint.h>
+#include <grub/util/misc.h>
+#include <grub/emu/hostdisk.h>
+#include <grub/emu/getroot.h>
+#include <fs_info.h>
+#include <Drivers.h>
+#include <StorageDefs.h>
+
+enum grub_dev_abstraction_types
+grub_util_get_dev_abstraction_os (const char *os_dev __attribute__((unused)))
+{
+  return GRUB_DEV_ABSTRACTION_NONE;
+}
+
+int
+grub_util_pull_device_os (const char *os_dev __attribute__ ((unused)),
+                         enum grub_dev_abstraction_types ab __attribute__ ((unused)))
+{
+  return 0;
+}
+
+char *
+grub_util_get_grub_dev_os (const char *os_dev __attribute__ ((unused)))
+{
+  return NULL;
+}
+
+char **
+grub_guess_root_devices (const char *dir_in)
+{
+  dev_t dv = dev_for_path (dir_in);
+  fs_info inf;
+  char **ret;
+  if (fs_stat_dev (dv, &inf) != B_OK)
+    return NULL;
+  ret = xmalloc (2 * sizeof (ret[0]));
+  ret[0] = xstrdup (inf.device_name);
+  ret[1] = NULL;
+  return ret;
+}
+
+grub_disk_addr_t
+grub_util_find_partition_start_os (const char *dev)
+{
+  partition_info part;
+  grub_disk_addr_t ret;
+  int fd = open (dev, O_RDONLY);
+  if (fd < 0)
+    return 0;
+  if (ioctl (fd, B_GET_PARTITION_INFO, &part, sizeof (part)) < 0)
+    {
+      close (fd);
+      return 0;
+    }
+  ret = part.offset;
+  close (fd);
+  fd = open (part.device, O_RDONLY);
+
+  device_geometry geo;
+  if (ioctl (fd, B_GET_GEOMETRY, &geo, sizeof (geo)) < 0)
+    return 0;
+  ret /= geo.bytes_per_sector;
+  close (fd);  
+  return ret;
+}
+
+char *
+grub_util_part_to_disk (const char *os_dev,
+                       struct stat *st __attribute__ ((unused)),
+                       int *is_part)
+{
+  char *ret;
+  partition_info part;
+  int fd = open (os_dev, O_RDONLY);
+  *is_part = 0;
+
+  if (fd < 0)
+    return xstrdup (os_dev);
+  if (ioctl (fd, B_GET_PARTITION_INFO, &part, sizeof (part)) < 0)
+    {
+      close (fd);
+      return xstrdup (os_dev);
+    }
+  ret = xstrdup (part.device);
+  close (fd);
+  *is_part=1;
+  return ret;
+}
+
+int
+grub_util_biosdisk_is_floppy (grub_disk_t disk)
+{
+  const char *dname;
+
+  dname = grub_util_biosdisk_get_osdev (disk);
+
+  return (strncmp (dname, "/dev/disk/floppy/", sizeof ("/dev/disk/floppy/") - 1)
+         == 0);
+}
diff --git a/grub-core/osdep/haiku/hostdisk.c b/grub-core/osdep/haiku/hostdisk.c
new file mode 100644 (file)
index 0000000..5623539
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 1999,2000,2001,2002,2003,2004,2006,2007,2008,2009,2010,2011,2012,2013  Free Software Foundation, Inc.
+ *
+ *  GRUB is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  GRUB is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <config-util.h>
+
+#include <grub/disk.h>
+#include <grub/partition.h>
+#include <grub/msdos_partition.h>
+#include <grub/types.h>
+#include <grub/err.h>
+#include <grub/emu/misc.h>
+#include <grub/emu/hostdisk.h>
+#include <grub/emu/getroot.h>
+#include <grub/misc.h>
+#include <grub/i18n.h>
+#include <grub/list.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <limits.h>
+#include <sys/ioctl.h>
+#include <Drivers.h>
+#include <StorageDefs.h>
+
+grub_int64_t
+grub_util_get_fd_size_os (grub_util_fd_t fd,
+                         const char *name __attribute__ ((unused)),
+                         unsigned *log_secsize)
+{
+  device_geometry part;
+  unsigned lg;
+  if (ioctl (fd, B_GET_GEOMETRY, &part, sizeof (part)) < 0)  
+    return -1;
+  for (lg = 0; (1 << lg) < part.bytes_per_sector; lg++);
+  if (log_secsize)
+    *log_secsize= lg;
+  return ((grub_uint64_t) part.cylinder_count
+         * (grub_uint64_t) part.head_count
+         * (grub_uint64_t) part.sectors_per_track
+         * (grub_uint64_t) part.bytes_per_sector);
+}
+
+void
+grub_hostdisk_flush_initial_buffer (const char *os_dev __attribute__ ((unused)))
+{
+}
index ae491b5..1853979 100644 (file)
@@ -14,6 +14,8 @@
 #include "windows/hostdisk.c"
 #elif defined(__AROS__)
 #include "aros/hostdisk.c"
+#elif defined (__HAIKU__)
+#include "haiku/hostdisk.c"
 #else
 # warning "No hostdisk OS-specific functions is available for your system. Device detection may not work properly."
 #include "basic/hostdisk.c"
index 410d58d..ef38037 100644 (file)
@@ -40,7 +40,7 @@
 #include <grub/cryptodisk.h>
 #include <grub/i18n.h>
 
-#if !defined (__MINGW32__) && !defined (__CYGWIN__) && !defined (__AROS__)
+#if !defined (__MINGW32__) && !defined (__CYGWIN__) && !defined (__AROS__) && !defined (__HAIKU__)
 
 #ifdef __linux__
 #include <sys/ioctl.h>         /* ioctl */
index 8489a16..56d3923 100644 (file)
@@ -49,10 +49,12 @@ grub_make_system_path_relative_to_its_root (const char *path)
     grub_util_error (_("failed to get canonical path of `%s'"), path);
 
   /* For ZFS sub-pool filesystems, could be extended to others (btrfs?).  */
+#ifndef __HAIKU__
   {
     char *dummy;
     grub_find_zpool_from_dir (p, &dummy, &poolfs);
   }
+#endif
 
   len = strlen (p) + 1;
   buf = xstrdup (p);
index 8a0d52a..50883f4 100644 (file)
@@ -97,7 +97,7 @@ typedef int grub_util_fd_t;
 #define GRUB_UTIL_FD_IS_VALID(x) ((x) >= 0)
 #define GRUB_UTIL_FD_STAT_IS_FUNCTIONAL 1
 
-#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__APPLE__) || defined(__NetBSD__) || defined (__sun__) || defined(__OpenBSD__)
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__APPLE__) || defined(__NetBSD__) || defined (__sun__) || defined(__OpenBSD__) || defined(__HAIKU__)
 #define GRUB_DISK_DEVS_ARE_CHAR 1
 #else
 #define GRUB_DISK_DEVS_ARE_CHAR 0